57

「jta-datasource」と「resource-local datasource」という用語は、私には少しあいまいです。私が理解していること (または推測していること) を書き留めています。どこが正しい/間違っているか教えてください。

  • 同じデータベースを jta-datasource またはリソース ローカル データソースとして参照できます
  • jta-datasource と記載されている場合、Bean やその他のクラスは JTA を使用できます。したがって、 UserTransaction インターフェイス
  • データソースがリソース ローカルの場合、CMT / BMTを使用できません
  • リソース ローカル データソースとして言及されている場合、トランザクションは JTA を認識しません。コードは EntityTransaction インターフェイスを使用できますが、UserTransaction インターフェイスは使用できません

ありがとう!

4

1 に答える 1

71

The terms "jta-datasource" and "resouce-local datasource" are a little vague to me.

I guess you actually refer to the jta-datasource and non-jta-datasource elements. In short:

  • if the transaction type of the persistence unit is JTA, the jta-datasource element is used to declare the JNDI name of the JTA data source that will be used to obtain connections. This is the common case.
  • if the transaction type of the persistence unit is resource-local, the non-jta-data-source should be used to declare the JNDI name of a non-JTA data source.
  • The same database can be referred to as a jta-datasource or as a resource local datasource

This is correct. And I didn't mention that just above but some providers even allow to declare both a jta-datasource and a non-jta-datasource and use the later for optimized reading through non-JTA connections (i.e. that won't be associated to an ongoing JTA transaction).

  • If mentioned as jta-datasource, then the beans / other classes can use JTA. Hence, UserTransaction interface.

The first part is correct, the last part not entirely. From the EJB 3.0 spec, section 13.3.4 Enterprise Beans Using Container-Managed Transaction Demarcation:

The enterprise bean’s business methods [...] must not attempt to obtain or use the javax.transaction.UserTransaction interface.

And section 16.12 UserTransaction Interface:

The container must not make the UserTransaction interface available to the enterprise beans that are not allowed to use this interface.

In other words, the UserTransaction interface is not available to CMT enterprise beans.

  • Cannot use CMT / BMT if the datasource is resource local

The wording is a bit confusing here but I'd say that this not strictly correct. From the JPA 1.0 specification, section § 5.5 Controlling Transactions:

An application-managed entity manager may be either a JTA entity manager or a resource-local entity manager.

...

Both JTA entity managers and resource-local entity managers are required to be supported in Java EE web containers and EJB containers. Within an EJB environment, a JTA entity manager is typically used.

And section 6.2.1.2 transaction-type

The transaction-type attribute is used to specify whether the entity managers provided by the entity manager factory for the persistence unit must be JTA entity managers or resource-local entity managers. The value of this element is JTA or RESOURCE_LOCAL. A transaction-type of JTA assumes that a JTA data source will be provided — either as specified by the jta-data-source element or provided by the container. In general, in Java EE environments, a transaction-type of RESOURCE_LOCAL assumes that a non-JTA datasource will be provided. In a Java EE environment, if this element is not specified, the default is JTA.

So you CAN use an application managed entity manager which can be a resource-local entity manager (you must inject an EntityManagerFactory to get the EM from it in that case) and it won't be part of a JTA transaction. See this (very interesting) discussion.

  • If mentioned as resource local datasource, transactions are not JTA aware. Code can use EntityTransaction interface but not UserTransaction interface

Again, the wording is a bit confusing but I'd say that this is correct.

于 2010-07-10T06:54:30.597 に答える