web-dev-qa-db-fra.com

Différence entre une "jta-source de données" et une "ressource-locale" source de données?

Les termes "jta-datasource" et "resource-local dataource" sont un peu vagues pour moi. J'écris ce que je comprends (ou suppose) et j'aimerais que vous me disiez où j'ai raison/tort.

  • La même base de données peut être appelée source de données jta ou source de données locale de ressource
  • S'ils sont mentionnés en tant que source de données jta, les beans/autres classes peuvent utiliser JTA. Par conséquent, l'interface UserTransaction
  • Impossible d'utiliser CMT / BMT si la source de données est une ressource locale
  • Si elles sont mentionnées comme source de données locale de ressource, les transactions ne sont pas compatibles avec JTA. Le code peut utiliser l'interface EntityTransaction mais pas l'interface UserTransaction

Merci!

53
stratwine

Les termes "jta-datasource" et "resouce-local dataource" sont un peu vagues pour moi.

Je suppose que vous vous référez en fait aux éléments jta-datasource Et non-jta-datasource. En bref:

  • si le type de transaction de l'unité de persistance est [~ ~ ~] jta [~ # ~], l'élément jta-datasource est utilisé pour déclarer le nom JNDI de la source de données JTA qui sera être utilisé pour obtenir des connexions. C'est le cas commun.
  • si le type de transaction de l'unité de persistance est ressource-locale, le non-jta-data-source doit être utilisé pour déclarer le nom JNDI d'une source de données non-JTA.
  • La même base de données peut être appelée source de données jta ou source de données locale de ressource

C'est correct. Et je ne l'ai pas mentionné juste au-dessus, mais certains fournisseurs permettent même de déclarer à la fois un jta-datasource et un non-jta-datasource Et d'utiliser le dernier pour l'optimisation lecture via des connexions non JTA (c'est-à-dire qui ne seront pas associées à une transaction JTA en cours).

  • S'ils sont mentionnés comme jta-datasource, les beans/autres classes peuvent utiliser JTA. Par conséquent, l'interface UserTransaction.

La première partie est correcte, la dernière partie pas entièrement. Dans la spécification EJB 3.0, section 13.3.4 Enterprise Beans Using Container-Managed Transaction Demarcation :

Les méthodes métier du bean entreprise ne doivent pas [...] tenter d'obtenir ou d'utiliser l'interface javax.transaction.UserTransaction.

Et section 16.12 Interface UserTransaction :

Le conteneur ne doit pas mettre l'interface UserTransaction à la disposition des beans entreprise qui ne sont pas autorisés à utiliser cette interface.

En d'autres termes, l'interface UserTransaction n'est pas disponible pour les beans entreprise CMT.

  • Impossible d'utiliser CMT/BMT si la source de données est une ressource locale

Le libellé est un peu déroutant ici, mais je dirais que ce n'est pas strictement correct. À partir de la spécification JPA 1.0, section § 5.5 Contrôle des transactions :

Un gestionnaire d'entité géré par application peut être soit un gestionnaire d'entité JTA, soit un gestionnaire d'entité local de ressource.

...

Les gestionnaires d'entités JTA et les gestionnaires d'entités locaux de ressources doivent être pris en charge dans les conteneurs Web Java EE et les conteneurs EJB. Dans un environnement EJB, un gestionnaire d'entités JTA est généralement utilisé.

Et section 6.2.1.2 type de transaction

L'attribut transaction-type Est utilisé pour spécifier si les gestionnaires d'entités fournis par la fabrique de gestionnaires d'entités pour l'unité de persistance doivent être des gestionnaires d'entités JTA ou des gestionnaires d'entités locales de ressource. La valeur de cet élément est JTA ou RESOURCE_LOCAL. Un type de transaction de JTA suppose qu'une source de données JTA sera fournie - soit comme spécifié par l'élément jta-data-source Ou fourni par le conteneur. En général, dans les environnements Java EE, un transaction-type De RESOURCE_LOCAL Suppose qu'une source de données non JTA sera fournie. Dans un environnement Java EE, si cet élément n'est pas spécifié, la valeur par défaut est JTA.

Ainsi, vous POUVEZ utiliser un gestionnaire d'entité géré par l'application qui peut être un gestionnaire d'entité local-ressource (vous devez injecter un EntityManagerFactory pour en obtenir l'EM dans ce cas) et il ne fera pas partie d'une transaction JTA. Voir cette discussion (très intéressante) .

  • Si elles sont mentionnées comme source de données locale de ressource, les transactions ne sont pas compatibles avec JTA. Le code peut utiliser l'interface EntityTransaction mais pas l'interface UserTransaction

Encore une fois, le libellé est un peu déroutant, mais je dirais que c'est correct.

66
Pascal Thivent