2010-07-10 31 views
49

Los términos "jta-datasource" y "resource-local datasource" son un poco vagos para mí. Pongo lo que estoy entendiendo (o asumiendo) y me gustaría que diga dónde estoy bien/mal.¿Diferencia entre un origen de datos "jta-datasource" y un "datasource local de recursos"?

  • La misma base de datos se puede hacer referencia a como JTA-fuente de datos o como una fuente de datos local de recursos
  • que están indicados JTA-fuente de datos, a continuación, los granos/otras clases pueden utilizar JTA. Por lo tanto, la interfaz
  • UserTransaction no pueden utilizar CMT/BMT si la fuente de datos de recursos locales es
  • Si menciona como fuente de datos de recursos locales, las transacciones no son conscientes de JTA. El código puede usar la interfaz EntityTransaction pero no la interfaz UserTransaction

¡Gracias!

Respuesta

62

Los términos "jta-datasource" y "resouce-local datasource" son un poco vagos para mí.

Supongo que realmente se refiere a los elementos jta-datasource y non-jta-datasource. En resumen:

  • si el tipo de transacción de la unidad de persistencia es JTA, el elemento de jta-datasource se utiliza para declarar el nombre JNDI de la fuente de datos JTA que será utilizado para obtener conexiones. Este es el caso común.
  • si el tipo de transacción de la unidad de persistencia es recurso-local, el non-jta-data-source se debe utilizar para declarar el nombre JNDI de una fuente de datos no JTA.
  • La misma base de datos se puede hacer referencia como un jta-fuente de datos o como un recurso de origen de datos local de

Esto es correcto. Y no mencioné eso arriba, pero algunos proveedores incluso permiten declarar jta-datasourcey como non-jta-datasource y usar el último para lectura optimizada a través de conexiones que no son JTA (es decir, que no estarán asociadas a una transacción JTA en curso) .

  • Si menciona como JTA-fuente de datos, a continuación, los granos/otras clases pueden utilizar JTA. Por lo tanto, la interfaz UserTransaction.

La primera parte es correcta, la última parte no del todo. A partir de la especificación EJB 3.0, sección 13.3.4 Beans Enterprise Uso gestionada por contenedor demarcación de transacciones:

métodos de negocio del bean de la empresa [...] no debe intentar obtener o usar la interfaz javax.transaction.UserTransaction.

Y sección Interfaz 16.12 UserTransaction:

El envase no debe hacer que la interfaz UserTransaction a disposición de los granos de la empresa que no están autorizados a utilizar esta interfaz.

En otras palabras, la interfaz UserTransaction no está disponible para CMT enterprise beans.

  • no pueden usar CMT/BMT si la fuente de datos de recursos locales es

La redacción está un poco confuso aquí, pero yo diría que esto no es estrictamente correcto. A partir de la especificación JPA 1.0, sección § 5.5 Control de Transacciones:

Un gestor de entidad de aplicación gestionados puede ser un gestor de la entidad JTA o un gestor de la entidad local de recursos.

...

Tanto JTA gestores de entidad y se requieren gestores de entidad local de recursos para ser apoyado en contenedores web Java EE y contenedores EJB. Dentro de un entorno EJB, normalmente se usa un administrador de entidades JTA.

Y sección 6.2.1.2 de transacciones de tipo

El atributo transaction-type se utiliza para especificar si los gestores de entidad proporcionados por la fábrica gestor de la entidad para la unidad de persistencia deben ser gestores de entidad JTA o recursos gerentes de entidades locales. El valor de este elemento es JTA o RESOURCE_LOCAL. Un tipo de transacción de JTA supone que se proporcionará una fuente de datos JTA, ya sea como se especifica en el elemento jta-data-source o en el contenedor. En general, en entornos Java EE, un transaction-type de RESOURCE_LOCAL supone que se proporcionará un origen de datos no JTA. En un entorno Java EE, si este elemento no está especificado, el valor predeterminado es JTA.

esta manera puede utilizar una aplicación gestor de la entidad gestionada que puede ser un gestor de la entidad recursos locales (se tiene que inyectar un EntityManagerFactory para obtener la EM de ella en ese caso) y no habrá parte de una transacción JTA. Ver this (very interesting) discussion.

  • Si menciona como fuente de datos de recursos locales, las transacciones JTA no son conscientes. El código puede utilizar el interfaz EntityTransaction pero no interfaz UserTransaction

Una vez más, el texto es un poco confuso, pero yo diría que esto es correcto.

+0

Hola, ¡Muchas gracias por tomarse el tiempo y explicarlo todo tan claramente! Ahora veo que utilizamos el término "resource local EntityManager" y no "resource local datasource". Sí, quise decir no-jta-datasource cuando dije "resource local datasource". Así lo entiendo ahora: JTA/RESOURCE_LOCAL -> Tipo de transacción del EntityManager. Determina quién controla la transacción subyacente. si JTA/EntityTransaction API JTA EntityManger: Container gestiona este EntityManager. Involucra en transacciones de JTA. Una transacción JTA puede ser una CMT o un BMT. Puede ser utilizado en clases administradas. – stratwine

+0

Resource-Local EntityManager: EnityManager no está gestionado por el contenedor. Involucra en transacciones que no son JTA. EntityTransaction API se utiliza. puede utilizar en POJOs para BMT, UserTransaction siempre utiliza una fuente de datos JTA-y no se puede utilizar un no-JTA fuente de datos para la CMT Del mismo modo también, el contenedor sólo podría utilizar una fuente de datos JTA- – stratwine

+1

@stratwine: De nada , me alegra que lo haya encontrado útil (y su comprensión parece correcta). En cuanto a la redacción, no quise ser exigente, pero dado que la especificación define una terminología muy precisa (y sutil), su uso facilita la comunicación, por lo que insistí un poco en eso (y yo recomendaría leer las secciones que cité parcialmente). –

Cuestiones relacionadas