Spring, IBatis e Transazioni Aop Nel Jug Avis Web
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Spring, IBatis e Transazioni Aop Nel Jug Avis Web

on

  • 4,016 views

Slide sulle transazioni dichiarative con ibatis nel progetto MagicBox JugAvis, al Jug Sardegna Meeting a gennaio 2006

Slide sulle transazioni dichiarative con ibatis nel progetto MagicBox JugAvis, al Jug Sardegna Meeting a gennaio 2006

Statistics

Views

Total Views
4,016
Views on SlideShare
3,998
Embed Views
18

Actions

Likes
1
Downloads
22
Comments
0

3 Embeds 18

http://www.slideshare.net 11
http://www.linkedin.com 5
https://www.linkedin.com 2

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Spring, IBatis e Transazioni Aop Nel Jug Avis Web Presentation Transcript

  • 1. Spring, iBATIS e Transazioni AOP nel Jug Avis Web Massimiliano Dessì Frame S.r.l http://www.jugsardegna.org/vqwiki/jsp/Wiki?MassimilianoDessi Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 1 Macomer, 28 Gennaio 2006
  • 2. Architettura Generale Jug Avis Web: Interamente Interface Driven Design sviluppato usando TDD (Test Driven Development) Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 2 Macomer, 28 Gennaio 2006
  • 3. Data Access Tier: Soluzioni prese in considerazione per l'accesso a DB JDBC Hibernate iBatis Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 3 Macomer, 28 Gennaio 2006
  • 4. JDBC: Pro - Ben Conosciuta, possibilità controllo fine sul Codice e su SQL Contro -Eccessiva Verbosità -Manutenzione con query complesse composte dinamicamente -Codice “boilerplate” con try-catch obbligatori -La classe DAO “deve” sapere di essere eseguita dentro una transazione e deve essere scritto di conseguenza Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 4 Macomer, 28 Gennaio 2006
  • 5. Hibernate: Pro -ORM, ragionamento OO-LIKE , non SQL-LIKE -Tools per velocizzare generazione codice e files -Adatto con DB modificati spesso -Caching Contro -Non SQL-LIKE, no DBA Tuning -Necessario per il web l' uso del pattern Open Session in View -N+1 Select -Esperienza per controllo fine settaggi configurazione Licenza: GPL Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 5 Macomer, 28 Gennaio 2006
  • 6. iBatis: Pro -Data Mapper, SQL separato dal codice, DBA Tuning -Semplicissimo da usare -Caching -Velocità rispetto ad ORM -Ora disponibile tool per generazione codice (Abator) -N+1 select evitabile scrivendo opportunamente le query Contro Non è ancora “famoso” e conosciuto Licenza: Apache Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 6 Macomer, 28 Gennaio 2006
  • 7. iBatis configurazione con Spring <bean id=quot;jug4avisweb.sqlMapClientquot; class=quot;org.springframework.orm.ibatis.SqlMapClientFactoryBeanquot;> <property name=quot;configLocationquot;> <value>WEB-INF/jug-sqlMapConfig.xml</value> </property> </bean> <bean id=quot;jug4avisweb.dataSourcequot; class=quot;org.springframework.jndi.JndiObjectFactoryBeanquot;> <property name=quot;jndiNamequot;> <value>java:comp/env/jdbc/jug4avis</value> </property> </bean> <bean id=quot;transactionManagerquot; class=quot;org.springframework.jdbc.datasource.DataSourceTransactionManagerquot;> <property name=quot;dataSourcequot;><ref bean=quot;jug4avisweb.dataSourcequot;/></property> </bean> Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 7 Macomer, 28 Gennaio 2006
  • 8. <?xml version=quot;1.0quot; encoding=quot;UTF-8quot; ?> <!DOCTYPE sqlMapConfig PUBLIC quot;-//iBATIS.com//DTD SQL Map Config 2.0//ENquot; quot;http://www.ibatis.com/dtd/sql-map-config-2.dtdquot;> <sqlMapConfig> <settings cacheModelsEnabled=quot;truequot; enhancementEnabled=quot;truequot; lazyLoadingEnabled=quot;falsequot; maxRequests=quot;64quot; maxSessions=quot;20quot; maxTransactions=quot;8quot; useStatementNamespaces=quot;falsequot; /> <sqlMap resource=quot;org/jugsardegna/avis/web/db/ibatis/CentroAvisDaoPostgres.xmlquot;/> <sqlMap resource=quot;org/jugsardegna/avis/web/db/ibatis/DonorDaoPostgres.xmlquot;/> </sqlMapConfig> File di configurazione jug4avisweb-sqlMapConfig.xml Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 8 Macomer, 28 Gennaio 2006
  • 9. <?xml version=quot;1.0quot; encoding=quot;UTF-8quot; standalone=quot;noquot;?> <!DOCTYPE sqlMap PUBLIC quot;-//iBATIS.com//DTD SQL Map 2.0//ENquot; quot;http://www.ibatis.com/dtd/sql-map-2.dtdquot;> <sqlMap> <cacheModel id=quot;file-cachequot; type =quot;LRUquot; > <flushInterval hours=quot;24quot;/> <flushOnExecute statement=quot;insertCentroquot;/> <flushOnExecute statement=quot;deleteCentroquot;/> <flushOnExecute statement=quot;aggiornaCentroquot;/> <property name=quot;cache-sizequot; value=quot;1000quot; /> </cacheModel> <typeAlias type=quot;org.jugsardegna.avis.web.domain.CentroAvisquot; alias=quot;centroAvisquot;/> <resultMap class=quot;centroAvisquot; id=quot;resultCentroAvisquot;> <result property=quot;idquot; column=quot;idquot;/> <result property=quot;nomequot; column=quot;nomequot;/> <result property=quot;faxquot; column=quot;faxquot;/> <result property=quot;telefonoquot; column=quot;telefonoquot;/> <result property=quot;emailquot; column=quot;emailquot;/> <result property=quot;sitoWebquot; column=quot;sito_webquot;/> <result property=quot;localitaquot; column=quot;localitaquot;/> <result property=quot;creditoResiduoSmsquot; column=quot;credito_residuo_smsquot;/> <result property=quot;numeroDonatoriquot; column=quot;numero_donatoriquot;/> </resultMap> Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 9 Macomer, 28 Gennaio 2006
  • 10. <select id=quot;getCentroAvisquot; resultMap=quot;resultCentroAvisquot;> SELECT * FROM centri_avis WHERE id= #value# ; </select> <delete id=quot;deleteCentroquot; parameterClass=quot;longquot;> DELETE FROM centri_avis WHERE id=#value# ; </delete> <insert id=quot;insertCentroquot; parameterClass=quot;centroAvisquot;> <selectKey keyProperty=quot;idquot; resultClass=quot;longquot;> select nextval('id_univoco') </selectKey> INSERT INTO centri_avis (id, nome, localita, telefono, email, fax, sito_web, credito_residuo_sms, numero_donatori) VALUES ( #id#, #nome#, #localita#, #telefono#, #email#, #fax#, #sitoWeb#, #creditoResiduoSms#, #numeroDonatori#); </insert> <update id=quot;aggiornaCentroquot; parameterClass=quot;centroAvisquot;> UPDATE centri_avis SET nome = #nome# , telefono = #telefono#, email = #email#, fax =#fax#, sito_web = #sitoWeb#, localita = #localita#, credito_residuo_sms = #creditoResiduoSms#, numero_donatori = #numeroDonatori# WHERE Id = #id# ; </update> </sqlMap> File di configurazione CentroAvisDaoPostgres.xml Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 10 Macomer, 28 Gennaio 2006
  • 11. iBatis DAO (1) SqlMapCentroAvisDao public class SqlMapCentroAvisDao extends SqlMapClientDaoSupport implements ICentroAvisDao{ public List getCentriAvis(){ return getSqlMapClientTemplate().queryForList(quot;getCentriAvisquot;, null); } public CentroAvis getCentro(long idCentroAvis){ return (CentroAvis)getSqlMapClientTemplate(). queryForObject(quot;getCentroAvisquot;, new Long(idCentroAvis)); } Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 11 Macomer, 28 Gennaio 2006
  • 12. iBatis DAO (2) public long insertCentroAvis(CentroAvis centro){ return ((Long)getSqlMapClientTemplate(). insert(quot;insertCentroquot;, centro)).longValue(); } public int updateCentroAvis(CentroAvis centro){ return ((Integer)getSqlMapClientTemplate(). update(quot;aggiornaCentroquot;, centro)).intValue(); } public int deleteCentroAvis(long idCentroAvis){ return ((Integer)getSqlMapClientTemplate(). delete(quot;deleteCentroquot;, idCentroAvis)).intValue(); } } Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 12 Macomer, 28 Gennaio 2006
  • 13. - I dao non sanno minimamente di essere dentro una transazione o meno - non siamo obbligati a gestire try-catch (naturalmente in una altra parte della applicazione, verranno tracciate e gestite convenientemente in caso vengano lanciate eccezioni) - Le query sono separate e facili da modificare Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 13 Macomer, 28 Gennaio 2006
  • 14. Transazioni (obiettivo) Vogliamo fare in modo che alcuni metodi vengano eseguiti come unità atomiche di lavoro: - Senza modiche nel codice in maniera che siano metodi riutilizzabili - Senza scrivere codice, ma dichiarando (Declarative Transaction Demarcation) semplicemente quali metodi e con quali livelli di scope Nota: Le transazioni di cui necessitiamo sono su un datasource locale, non distribuito. Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 14 Macomer, 28 Gennaio 2006
  • 15. Per realizzare i nostri obiettivi usiamo il supporto per utilizzare l'AOP (Aspect Oriented Programming) per mezzo di Spring. Con AspectJ o con classi Java che fungano da Proxy In questa brevissima presentazione vedremo il secondo caso, di più facile comprensione. Nota: AspectJ verrà usato nel Jug Avis Web con l'uscita della versione 2.0 di Spring nella primavera 2006 Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 15 Macomer, 28 Gennaio 2006
  • 16. Brevissima spiegazione sull' AOP: -Separazione delle competenze trasversali -Complementare all' OO es. Nelle classi, dove è necessario il logging, ad esempio il tracciamento delle eccezioni, viene richiamato un Logger (staticamente o con l' IOC ), e viene eseguito il tracciamento Con la programmazione ad Aspetti scriviamo solo una volta il modulo (Aspect) e nella sua dichiarazione diciamo quando deve essere eseguito. Se usiamo AspectJ, durante la “compilazione” (weaving), l' aspect weaver (compilatore compone il sistema finale legando i nostri moduli trasversali (aspects) . Naturalmente questo processo produce bytecode standard per la virtual machine. Il logger sparisce dalle classi dove lo avremmo dovuto mettere per poterlo usare con il solo uso dell' OO. Possiamo anzi, creare anche un aspect che gestisca il lancio delle eccezioni ! Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 16 Macomer, 28 Gennaio 2006
  • 17. Grazie all' AOP possiamo modularizzare le competenze trasversali che altrimenti con la programmazione ad Oggetti “tradizionale” sarebbero presenti in tutte le classi in cui sono necessarie. Vediamo invece ora come è possibile “emulare” il funzionamento di AspectJ, con delle classi proxy usando il pattern Proxy e Decorator. Naturalmente il funzionamento con le classi proxy, è conforme alle interfacce della AOP Alliance, per poter essere interoperabile tra le varie implementazioni AOP. Il funzionamento con i Proxy di SpringAOP, ruota attorno all' uso di una catena di intercettori tra l'oggetto chiamante e quello invocato. Ogni elemento della catena ha la possibilità di interporre logica prima della invocazione, dopo l'invocazione, o circuitare anche l' invocazione. Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 17 Macomer, 28 Gennaio 2006
  • 18. Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 18 Macomer, 28 Gennaio 2006
  • 19. Ora che abbiamo spiegato in maniera molto veloce lo scopo dell' AOP, vediamo come possiamo usarlo nel JUG Avis per le Transazioni. Prendiamo come esempio la classe ManagerCentriAvis, dove, quando un centro deve essere eliminato, deve eliminare nella stessa transazione anche i donatori di quel centro. Perciò questa classe sarà la classe target. Come Proxy usiamo un classe predefinita fornita da Spring: TransactionProxyFactoryBean (AOP Proxy di pag. 18) che per fare il suo lavoro ha bisogno dell' iniezione di -TransactionManager -Target (ManagerCentriAvis) -TransactionAttributes (nomi o pattern ai quali applicare la transazionalità) Nella parte dei TransactionAttributes possiamo definire la propagazione della transazione, il livello di isolamento, il timeout e il flag readOnly. Nota: Se avessimo bisogno di dichiarare più manager useremmo una altra tecnica. Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 19 Macomer, 28 Gennaio 2006
  • 20. <bean id=quot;jug4avisweb.managerCentriAvisTargetquot; class=quot;org.jugsardegna.avis.web.service.impl.ManagerCentriAvisquot;> <property name=quot;centroAvisDaoquot;><ref bean=quot;jug4avisweb.centroAvisDaoquot;/></property> <property name=quot;managerDonorsquot;><ref bean=quot;jug4avisweb.managerDonorquot;/></property> </bean> <bean id=quot;jug4avisweb.managerCentriAvisquot; class=quot;org.springframework.transaction.interceptor.TransactionProxyFactoryBeanquot;> <property name=quot;transactionManagerquot;> <ref bean=quot;transactionManagerquot;/> </property> <property name=quot;targetquot;> <ref bean=quot;jug4avisweb.managerCentriAvisTargetquot;/> </property> <property name=quot;transactionAttributesquot;> <props> <prop key=quot;insert*quot;>PROPAGATION_REQUIRED</prop> <prop key=quot;update*quot;>PROPAGATION_REQUIRED</prop> <prop key=quot;delete*quot;>PROPAGATION_REQUIRED</prop> </props> </property> </bean> Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 20 Macomer, 28 Gennaio 2006
  • 21. Transaction Attributes: PROPAGATION_REQUIRED : Supporta la transazione esistente, Se non esiste ne crea una nuova PROPAGATION_SUPPORTS: Supporta la transazione esistente, Se non esiste esegue non transazionalmente PROPAGATION_MANDATORY:Supporta la transazione esistente, Se non esiste lancia una eccezione PROPAGATION_REQUIRES_NEW:Fa partire sempre una nuova transazione, se ne esiste già una la sospende. PROPAGATION_NOT_SUPPORTED:Non viene eseguito se esiste una transazione attiva. Eseguito sempre non transaz.e sospende quelle attive. PROPAGATION_NEVER: Eseguito non transazionalmente, viene lanciata na eccezione se esiste una transazione attiva. PROPAGATION_NESTED:Eseguito in una transazione annidata se ne esiste una, altrimenti, viene eseguita come propagation_required. Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 21 Macomer, 28 Gennaio 2006
  • 22. Riferimenti 1 Spring : http://www.springframework.org Nel Jug Sardegna (Articoli, Recensioni Libri): http://www.jugsardegna.org/vqwiki/jsp/Wiki?SpringFramework Jug Avis: http://www.jugsardegna.org/vqwiki/jsp/Wiki?JugAvis Jug Avis Web (prima parte): http://www.jugsardegna.org/vqwiki/jsp/Wiki?action=action_view_attachment &attachment=Spring_webflowJug16Luglio2005.pdf Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 22 Macomer, 28 Gennaio 2006
  • 23. Riferimenti 2 IBatis : http://ibatis.apache.org/ Nel Jug Sardegna: http://www.jugsardegna.org/vqwiki/jsp/Wiki?IBatisCaseStudy Abator for iBatis: http://ibatis.apache.org/abator.html Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 23 Macomer, 28 Gennaio 2006
  • 24. Riferimenti 3 AspectJ: http://www.eclipse.org/aspectj/ Aspect-Oriented Software Development AOSD http://www.aosd.net/ AspectJ in Action http://www.manning.com/books/laddad Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 24 Macomer, 28 Gennaio 2006
  • 25. Grazie per l'attenzione. Massimiliano Dessì, Spring, iBatis e Transazioni AOP nel Jug Avis Web. 25 Macomer, 28 Gennaio 2006