2008-10-07 4 views
4

J'utilise une API fournisseur pour obtenir une connexion JDBC à la base de données de l'application. L'API fonctionne lors de l'exécution sur le serveur d'applications ou lors de l'exécution en mode autonome. Je veux exécuter une série d'instructions SQL en une seule transaction. Je vais bien avec eux se produire dans le contexte de la transaction JTA si elle existe. Cependant, si ce n'est pas le cas, j'ai besoin d'utiliser les méthodes de démarcation des transactions JDBC. (L'appel de ces méthodes sur une connexion JDBC qui participe à une transaction JTA entraîne une exception SQLException.)Comment déterminez-vous si une connexion JDBC a été récupérée à partir d'un DataSource compatible JTA ou d'un JDBC direct?

Je dois donc pouvoir déterminer si la connexion provient de DataSource compatible JTA ou s'il s'agit simplement d'une connexion JDBC directe.

Existe-t-il un moyen simple de faire cette détermination?

Merci!

Répondre

4

Même si c'est JDBC direct, vous pouvez activer une transaction JTA. La vérification du drapeau autoCommit n'aidera pas à cet égard. Vous pouvez être dans une transaction, distribuée ou non, avec autoCommit défini sur false. autoCommit défini sur true vous dira que vous n'êtes pas dans une transaction distribuée mais une valeur false signifie simplement que vous ne commettrez pas d'auto-commit ... cela pourrait être dans n'importe quel type de transaction.

Je pense que vous devrez appeler UserTransaction.getStatus() et vérifier qu'il n'est pas égal à Status.NoTransaction(). Cela vous dirait si vous êtes dans une transaction JTA.

-1

Vous pouvez essayer de vérifier l'indicateur autoCommit de Connection pour voir s'il s'agit d'une transaction (peu importe d'où elle vient). (. Apparemment, voir la réponse acceptée, cela ne fonctionne pas trop bien, je ne suis pas la suppression de cette réponse, car ce qui suit est toujours debout:)

Mais je pense que vous devriez vraiment modifier votre API à dépendre des transactions extérieures exclusivement . Si vous voulez toujours prendre en charge JDBC simple, intégrez-le dans une API distincte qui démarre la transaction. Mise à jour: Il suffit de relire votre question et vu que vous ne fournissez pas une API, mais que vous souhaitez utiliser une connexion gérée par conteneur. Mais encore, pouvez-vous simplement mandater (dans le cadre des exigences de votre application) que la JTA soit en vigueur? Sinon, vous pouvez fournir une option de configuration pour revenir aux transactions gérées manuellement. Pour une fonctionnalité aussi critique, il semble raisonnable d'exiger la configuration appropriée (par opposition à essayer de deviner ce qui serait approprié).

+0

La validation automatique est un comportement qui dit commettre de toute façon il ne communique pas réellement quelque chose est XA ou transacté etc. –

0

Ce que thilo dit a du sens.

Sinon, pas sûr d'un droit chemin, mais je vais vous donner un moyen « pirater »

écrire un mauvais SQL que vous connaissez donnera une exception DB. Cela entraînera une trace de pile. À partir de la trace de la pile, vous pouvez savoir s'il s'agit d'une connexion dérivée JTA ou NON?

Questions connexes