Comment déterminez-vous si une connexion JDBC a été extraite d'un DataSource compatible JTA ou d'un JDBC simple?

StackOverflow https://stackoverflow.com/questions/180713

  •  05-07-2019
  •  | 
  •  

Question

J'utilise une API de 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 en mode autonome. Je souhaite exécuter une série d'instructions SQL dans une transaction unique. Je suis d'accord avec eux dans le contexte de la transaction JTA si elle existe. Cependant, dans le cas contraire, je dois utiliser les méthodes de démarcation des transactions JDBC. (L'appel de ces méthodes sur une connexion JDBC participant à une transaction JTA provoque une exception SQLException.)

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

Existe-t-il un moyen simple de prendre cette décision?

Merci!

Était-ce utile?

La solution

Même s'il s'agit directement de JDBC, 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 de false signifie simplement que vous ne vous engagez pas automatiquement ... cela pourrait être dans n'importe quel type de transaction.

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

Autres conseils

Ce que dit thilo a du sens.

Sinon, vous n'êtes pas sûr d'une solution directe MAIS je vais vous donner un "hack" chemin

écrivez un BAD SQL qui, vous le savez, donnera une exception de base de données. 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 de JTA ou non?

Vous pouvez essayer de vérifier l'indicateur autoCommit de la connexion pour voir s'il s'agit d'une transaction (quelle que soit son origine). (Apparemment, voir la réponse acceptée, cela ne fonctionne pas trop bien. Je ne supprime pas cette réponse car les éléments suivants sont toujours valables:)

Mais je pense que vous devriez vraiment modifier votre API pour qu'elle dépende exclusivement de transactions externes. Si vous souhaitez toujours prendre en charge JDBC brut, intégrez-le dans une API distincte qui ne fait que démarrer la transaction.

Mise à jour: relisez simplement votre question et constatez que vous ne fournissez pas une API, mais souhaitez utiliser une connexion gérée par conteneur. Néanmoins, pouvez-vous simplement exiger (dans le cadre des exigences de votre application) que JTA soit en vigueur? Sinon, vous pouvez fournir une option de configuration permettant de revenir aux transactions gérées manuellement. Pour une fonctionnalité aussi critique, il semble raisonnable d'exiger la configuration appropriée (au lieu d'essayer de deviner ce qui serait approprié).

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