Question

Supposons que je veuille implémenter un conteneur d'applications. Pas une pile Java EE complète, mais je dois fournir un accès aux ressources et transactions JDBC au code tiers qui sera déployé dans une application que j'écris.

Supposons, de plus, que je regarde JBossTS pour les transactions. Pour autant que je sache, cela ne me convient pas, mais cela me semble être la meilleure solution.

Comment intégrer le support pour fournir des ressources de connexion et des transactions JTA dans mon application Java SE?

Était-ce utile?

La solution 7

J'ai choisi d'utiliser le gestionnaire de transactions Bitronix pour résoudre ce problème, bien qu'il semble qu'il existe au moins une autre option qui ne m'apparaissait pas à l'époque (Atomikos).

Pour résoudre ce problème, j'ai finalement dû utiliser le fournisseur JNDI in-process de Tomcat, afin d'associer la transaction à un nom JNDI. En raison d'une limitation de ce fournisseur, je ne pouvais pas utiliser le nom par défaut d'une transaction JTA UserTransaction, ce qui n'apparaît pas immédiatement dans la documentation.

Merci à tous pour les réponses utiles de toute façon!

Autres conseils

  

Comment intégrer le support pour   fournir des ressources de connexion et JTA   transactions dans mon application J2SE?

Bonjour Chris

Ce problème comporte deux éléments:

1) Mise à disposition de l'API JTA, principalement UserTransaction, au code de l'application, afin qu'elle puisse démarrer et terminer des transactions. Dans un environnement Java EE, il est publié dans un emplacement bien connu dans JNDI. Si vous avez une implémentation JNDI qui vous convient parfaitement (utilisez la classe JBossTS & # 8217; JNDIManager pour vous aider à configurer). Sinon, vous avez besoin d'un type d'objet d'usine ou d'un mécanisme d'injection. Bien sûr, vous pouvez également exposer directement la classe d'implémentation à l'utilisateur final, mais c'est un peu désagréable, car cela limite les chances de remplacer le JTA par la suite.

public javax.transaction.UserTransaction getUserTransaction() {
  return new com.arjuna.ats.internal.jta.transaction.UserTransactionImple();
}

C'est ça & # 8211; c'est & # 8211; vous pouvez maintenant commencer, valider et annuler des transactions. Certains conteneurs publient également la classe TransactionManager dans les applications de la même manière, mais elle est vraiment conçue pour être utilisée par le conteneur lui-même et est rarement utilisée par le code de l’application.

2) Gestion de l'inscription de XAResources automatiquement. Les gestionnaires de ressources, c’est-à-dire les bases de données et les files de messages, disposent de pilotes qui implémentent XAResource. Chaque fois que l'application obtient une connexion au gestionnaire de ressources, une ressource XAR correspondante doit être transférée à l'implémentation JTA afin qu'elle puisse piloter le gestionnaire de ressources dans le cadre du 2PC. La plupart des serveurs d'applications sont livrés avec un JCA qui gère cela automatiquement. Dans les environnements dépourvus, il vous faut une alternative pour éviter au code de l'application de devoir effectuer cette tâche fastidieuse à la main. Le TransactionalDriver fourni avec JBossTS gère cela pour les connexions JDBC. XAPool peut également être utile.

JBossTS a été intégré à de nombreux environnements au fil des ans. Certaines des leçons apprises sont documentées dans le Guide d'intégration http: //anonsvn.jboss.org/repos/labs/labs/jbosstm/trunk/atsintegration/docs/ ] et si vous souhaitez un exemple concret, vous pouvez consulter le travail d'intégration de tomcat http://anonsvn.jboss.org/repos/labs/labs/labs/jbosstm/workspace / jhalliday / tomcat-integration / ]

  

JBoss TM est horrible. Du moins si   vous souhaitez des transactions ACID.

Bonjour Erickson

Je ne pense pas que j'irais aussi loin que "8216". C’est incroyablement puissant et hautement configurable, ce qui peut rendre l’instantané quelque chose de déconcertant pour les nouveaux arrivants. La configuration correcte de la récupération est particulièrement délicate. Je souscris sans réserve à votre commentaire sur les tests rigoureux. En dehors de cela, je ne suis pas au courant de cas de test documentés dans lesquels il ne parvient pas à fournir de résultats ACID lorsqu'il est utilisé avec des gestionnaires de ressources conformes aux spécifications. Si vous avez des cas, ou juste des suggestions plus constructives d'amélioration, veuillez en informer JBoss afin que le problème puisse être résolu.

  

Ne réinventez pas la roue. Utilisez le   Cadre de printemps. Il fournit déjà   cette fonctionnalité et bien plus encore.

-1 Spring ne fournit pas d'implémentation JTA, mais simplement un wrapper pour diverses applications tierces. C'est un malentendu courant.

  

JTA prend en charge les transactions locales et   transactions globales.

Une autre idée fausse que je crains. La spécification JTA ne traite que des transactions XA, c'est-à-dire globales. Il existe diverses techniques bien connues permettant à un gestionnaire de transactions JTA de gérer des transactions locales. Celles-ci impliquent généralement d'encapsuler la connexion dans un fichier XAResource. Bien que la plupart des implémentations le prennent en charge, il s’agit en fait d’un domaine non couvert par la spécification. Vous devez donc vérifier auprès de

Essayez Atomikos TransactionsEssentials .

Contrairement aux implémentations Open Source JTA / XA concurrentes, celle-ci a été écrite dès le début pour JSE. Par conséquent, il offre des pools JDBC et JMS de qualité supérieure ainsi que des fonctionnalités JTA / XA, et il vous sera très facile de l'intégrer à vos applications.

Meilleur Guy

Ne réinventez pas la roue. Utilisez le Framework Spring . Il fournit déjà cette fonctionnalité et bien plus encore.

Vous pouvez utiliser le printemps, même si je ne suis pas si enthousiaste.

Un exemple de ce que vous pourriez souhaiter est ici

JTA prend en charge les transactions locales et les transactions globales .

Les transactions locales peuvent être facilement gérées par Spring, JPA ou même des validations manuelles sur les connexions.

Transactions globales OBTENIR un coordinateur de transactions. Il s’agit d’un produit / bibliothèque séparé qui n’est pas facilement disponible en open source (ou du moins je ne le connais pas).

Donc, si je regarde l'en-tête de votre message ("JTA"), la réponse est NO SIMPLE WAY .

Si je lis votre message lui-même ("donnez accès aux ressources et transactions JDBC"), je dirais que Spring, JPA et Hibernate couvriront tous vos besoins (tels que je les ai compris).

P.S. Correction : JTA ne prend pas en charge les transactions locales (comme certaines personnes me l'ont signalé), mais un cas dans lequel vous n'avez besoin que d'une seule connexion est essentiellement une transaction locale, même si elle est contrôlée par JTA, en particulier lorsque Transaction Manager est situé dans la même machine virtuelle (comme cela arrive souvent).

"TM de JBoss est horrible. Du moins, si vous espérez des transactions ACID. Le mieux que l'on puisse en dire, c'est qu'il ne sera probablement pas bousillé tant qu'il n'aura pas à faire face à des échecs. Et ce n’est pas seul ... la plupart des gestionnaires de transactions (même certains commerciaux) ne fonctionnent vraiment pas. "

Vous n’êtes pas sûr du travail que vous avez fait pour faire la déclaration ci-dessus, mais JBossTS (le TM dans JBoss depuis 2006, date de son acquisition) fournit une sémantique ACID complète. Il faisait également partie de la suite HP NetAction, où il a été déployé dans plus d’applications stratégiques que n’importe quel autre TM open source.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top