Je voudrais écrire ma prochaine webapp Java en utilisant l'un des micro-cadres. Par exemple. Spark ou Jooby. Le problème est que les deux ne supportent pas JTA, donc j'ai besoin d'utiliser une des bibliothèques tierces. J'ai googlé pour les implémentations JTA open-source et en ai trouvé deux: Atomikos et Bitronix. Il semble que ce dernier projet soit légèrement abandonné alors j'ai décidé d'aller avec Atomikos. Malheureusement, la documentation est rare, donc je ne trouve pas de réponses à mes questions.Comment utiliser correctement TransactionManager autonome dans une application Web?
Voici le cas d'utilisation. Supposons que nous ayons deux classes DAO quelles méthodes doivent être exécutées sous transaction unique:
class SomeService {
// both injected by Guice
private FooDao fooDao;
private BarDao barDao;
public void someMethod() {
// both methods should be executed in a single transaction
fooDao.insert(new Foo());
barDao.insert(new Bar());
}
}
Je n'ai jamais utilisé javax.transaction
API directement/manuellement avant (vous savez les transactions déclaratives sont très simples avec le printemps), donc je suis un peu confus. JTA fournit deux abstractions générales (UserTransaction
et TransactionManager
) et ils ont tous les deux des méthodes pour gérer la transaction JDBC. Autant que je comprenne TransactionManager exploite des objets UserTransaction en utilisant des variables ThreadLocal. Par conséquent UserTransaction doit être confiné au thread et TransactionManager supposé être thread-safe. Ai-je raison?
Donc il y a plusieurs approches possibles:
- Je peux injecter TransactionManager dans mon service (via Guice) et l'utiliser directement.
- Je peux partager TransactionManager via une variable statique publique.
- Je peux créer un fournisseur/une fabrique UserTransaction (via Guice) et en obtenir des objets.
Quelle est la bonne/meilleure pratique? Une autre question si quelqu'un connaissant Atomikos est qu'il fournit deux implémentations de gestionnaire de transactions (peut-être même plus): J2eeTransactionManager et UserTransactionManager. Encore une fois, la documentation est trop rare, donc je ne vois aucune différence sauf JNDI. Je suppose que UserTransactionManager devrait être suffisant pour mes besoins, mais les états de description qui suit
J2eeTransactionManager
Une mise en œuvre de TransactionManager qui devrait être utilisé par des applications J2EE .
.. sans aucune explication.
ps. Désolé mon anglais n'est pas bien je le sais.
De quel type de ressources de transaction envisagez-vous d'utiliser? Bases de données SQL simples JMS-Files d'attente/Sujets? Est-ce que JPA est impliqué, quel ORM hiberne ou eclipselink? Avez-vous l'intention d'utiliser des transactions distribuées? Voulez-vous être capable d'annoter des classes ou des méthodes avec des attributs de transaction ou les transactions «gérées par le bean» sont-elles suffisantes? – aschoerk
@aschoerk Tout ce dont j'ai besoin est d'exécuter deux méthodes à partir de classes DAO séparées en une seule transaction. J'utilise simple JDBC simple - pas de transactions JMS, JPA, XA ou d'autres choses JEE impliqués. J'utilise DI, cependant. Pour l'instant je veux juste comprendre comment partager correctement l'instance de TM ou UserTransaction. La gestion déclarative des transactions n'est pas nécessaire. Je suppose que, dès que je comprendrai comment utiliser TM, il sera assez simple d'écrire des transactions déclaratives personnalisées via un proxy de réflexion. – Evan
Pourquoi ne pas partager la connexion JDBC? Je pense que cela devrait être suffisant pour vous. Juste simple "BEGIN TRANSACTION" et "COMMIT TRANSACTION" peuvent être utilisés autour de vos appels dao, si ceux-ci utilisent la même connexion. C'est tout, que votre MT ferait pour vous dans ces circonstances. – aschoerk