2011-01-17 10 views
7

Sto sviluppando un'applicazione J2EE che viene distribuita sul server delle applicazioni JBoss. L'applicazione è composta da un componente EJB 2.x e un componente Web ed è in esecuzione su computer locale o server remoto. Il database è Oracle o SQL Server e non si trova in un ambiente distribuito.usa la transazione JTA o no?

Sto utilizzando Hibernate 3.6 (implementazione JPA 2.0) per le transazioni. Dovrei usare JTA che è una transazione gestita da un container o è troppo usata per usarla?

Attualmente sto usando JTA e risulta che funziona bene, ma con alcuni piccoli problemi che non so se sia correlato alla gestione delle transazioni o meno. Sarà più facile o più affidabile utilizzare la gestione delle transazioni locali?

+0

possibile duplicato del [transazioni JTA o locale JPA2 + Hibernate 3.6.0?] (Http://stackoverflow.com/questions/4559764/jta-or-local-transactions-in-jpa2hibernate- 3-6-0) –

+0

Grazie per il tuo commento. Quindi quale gestore delle transazioni dovrei usare se utilizzo sia EJB 2.x che JPA? Per l'applicazione Spring-Roo il valore predefinito è org.springframework.orm.jpa.JpaTransactionManager ma suppongo che dovrei usare qualcos'altro. – newguy

risposta

16

Le transazioni JTA sono sempre raccomandate sopra altri tipi di API di transazione, soprattutto se si fa riferimento alle transazioni native che fanno ancora parte dell'API JPA. Tieni presente che non puoi pronunciare "transazioni locali JTA vs risorse", poiché JTA gestisce effettivamente le transazioni locali delle risorse, tra le altre.

Gavin King (creatore di Hibernate) una volta ha indicato in un'intervista che questa API specifica di JPA era un errore e che l'API JTA molto più flessibile dovrebbe essere preferita. Soprattutto quando si usano le transazioni dichiarative, JTA è molto leggero. La parola overkill in realtà si applicherebbe di più all'utilizzo dell'API di transazione nativa JPA, quindi all'utilizzo di JTA.

C'è qualcosa da dire sulla scelta tra l'utilizzo di XA o le transazioni locali di risorse con JTA. Vedere la mia risposta qui per ulteriori dettagli a riguardo: JTA or LOCAL transactions in JPA2+Hibernate 3.6.0?

Mi chiedo perché si sta utilizzando EJB 2 in combinazione con JPA 2.0. EJB 3.1 sarebbe una scelta molto più logica qui. EJB 2 è completamente deprecato (sarà potato in Java EE 7).

+0

Grazie arjan. Sono attualmente in una fase di migrazione del mio progetto, quindi ho bisogno che entrambi EJB 2 e JPA 2 funzionino correttamente per essere in grado di testare le modifiche e non influenzare il comportamento del mio progetto. Alla fine della giornata il mio progetto verrà migrato completamente in JPA 2. – newguy

+0

Prego. Nota che le combinazioni più potenti sono EJB 3.1 + JPA 2. Questi due si completano notevolmente. –

1

Si consiglia di utilizzare la transazione XA, anche se l'applicazione attualmente accede a una sola risorsa (il database). Resons:

1) In futuro, se l'applicazione decide di includere alcune altre risorse transazionali oltre al database corrente, troverà più semplice la gestione delle transazioni XA già esistente e le molteplici risorse transazionali potranno quindi essere combinate in una singola transazione.

2) Poiché si dispone attualmente di una singola risorsa transazionale, non penso che le prestazioni potrebbero risentire dell'uso di XA rispetto alla transazione locale. Il motivo è che i gestori delle transazioni XA/JTA eseguono già un qualche tipo di ottimizzazione per i casi di singola risorsa transazionale (lo chiamano ottimizzazione monofase).

Spero che questo aiuti.

Nitin

+1

YAGNI, non si dovrebbero mai costruire cose basate su requisiti speculativi. Se c'è un chiaro bisogno di XA, allora usalo. Non farlo perché tu ne hai bisogno. – geoaxis