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.
Merci!
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:
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.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 estJTA
ouRESOURCE_LOCAL
. Un type de transaction de JTA suppose qu'une source de données JTA sera fournie - soit comme spécifié par l'élémentjta-data-source
Ou fourni par le conteneur. En général, dans les environnements Java EE, untransaction-type
DeRESOURCE_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.