¿Unidad de persistencia como RESOURCE_LOCAL o JTA?

87

Tengo consultas de la siguiente manera:

  1. ¿Cuál es la diferencia de estos dos?
  2. ¿Ambos son compatibles con todas las bases de datos?
  3. ¿Son JPA TransactionManager y JTA TransactionManager diferentes?
cometa
fuente

Respuestas:

101

Las implementaciones de JPA tienen la opción de administrar las transacciones por sí mismas ( RESOURCE_LOCAL) o hacer que las administre la implementación de JTA del servidor de aplicaciones.

En la mayoría de los casos, RESOURCE_LOCAL está bien. Esto usaría transacciones básicas de nivel JDBC. La desventaja es que la transacción es local para la unidad de persistencia JPA, por lo que si desea una transacción que abarque varias unidades de persistencia (u otras bases de datos), es posible que RESOURCE_LOCAL no sea lo suficientemente bueno.

JTA también se usa para administrar transacciones en sistemas como JMS y JCA, pero ese es un uso bastante exótico para la mayoría de nosotros.

Para usar JTA, necesita soporte en su servidor de aplicaciones y también soporte del controlador JDBC.

skaffman
fuente
3
parece que glassfih no me permite usar resource_local, ¿cómo puedo hacer eso?
Pete_ch
3
Como nota al margen: todavía se puede obtener la funcionalidad JTA, incluso sin un servidor de aplicaciones Java EE completo mediante el uso de soluciones de terceros, como por ejemplo Atomikos . Por lo tanto, puede tener un contenedor web ligero como Tomcat y aún obtener el soporte JTA.
informatik01
84

Como complemento a otras respuestas

Aquí hay un extracto del artículo extremadamente útil (publicado en el sitio web de Apache TomEE ), que también puede ayudar a responder la primera pregunta del OP (el enlace al artículo se encuentra a continuación).


Comparación de contextos de persistencia RESOURCE_LOCAL y JTA


Con <persistence-unit transaction-type = "RESOURCE_LOCAL"> USTED es responsable de la creación y seguimiento de EntityManager (PersistenceContext / Cache) ...

  • Usted debe utilizar el EntityManagerFactory para obtener un EntityManager
  • La instancia de EntityManager resultante es PersistenceContext / Cache
  • Una EntityManagerFactory se puede inyectar a través de la anotación @PersistenceUnit solo (no @PersistenceContext)
  • No se le permite usar @PersistenceContext para referirse a una unidad de tipo RESOURCE_LOCAL
  • Usted debe utilizar el EntityTransaction API para comenzar / commit alrededor de cada llamada a su EntityManger
  • Llamar a entityManagerFactory.createEntityManager () dos veces da como resultado dos instancias de EntityManager separadas y, por lo tanto, dos PersistenceContexts / Caches separados.
  • Es casi nunca es una buena idea tener más de una instancia de un EntityManager en uso (no crear un segundo menos que haya destruido la primera)


Con <persistence-unit transaction-type = "JTA"> el CONTENEDOR hará el EntityManager (PersistenceContext / Cache) creando y rastreando ...

  • No puede usar EntityManagerFactory para obtener un EntityManager
  • Solo puede obtener un EntityManager proporcionado por el contenedor
  • Un EntityManager se puede inyectar a través de la anotación @PersistenceContext solo (no @PersistenceUnit)
  • No se le permite usar @PersistenceUnit para referirse a una unidad de tipo JTA
  • El EntityManager proporcionado por el contenedor es una referencia al PersistenceContext / Cache asociado con una transacción JTA.
  • Si no hay ninguna transacción JTA en curso, EntityManager no se puede utilizar porque no hay PersistenceContext / Cache.
  • Todos los que tengan una referencia de EntityManager a la misma unidad en la misma transacción tendrán automáticamente una referencia al mismo PersistenceContext / Cache
  • PersistenceContext / Cache se vacía y borra en el momento de la confirmación de JTA

Cualquiera que esté interesado en aprender la API de persistencia de Java, hágase un favor y lea el artículo completo aquí: Conceptos de JPA: JPA 101 .

informatik01
fuente
8
Solo quería agregar un punto: si está usando Spring, puede usar @ PersistenceContext y EntityManager con Resource_Local. En este caso, el contenedor Spring puede administrar la transacción usando la anotación @ Transactional.
Sam
En mi proyecto transaction-type=RESOURCE_LOCALy @PersistenceContexty @Transactionalgestionado por la primavera
Ravi Parekh
Estoy golpeando el triángulo hacia arriba debido al enlace que proporcionaste.
Koray Tugay
@KorayTugay Lo siento, no entendí muy bien lo que dices, ¿qué triángulo?
informatik01
1
@LinuRadu Esta respuesta podría ser útil para usted: ¿Cuál es el uso de session.flush () en Hibernate
informatik01
18

Resource_Local y JTA son administradores de transacciones (métodos para realizar transacciones). Esta no es propiedad de la base de datos, sino el componente responsable de coordinar las transacciones. Los administradores de transacciones JPA y JTA son diferentes. El administrador de transacciones de JPA es responsable de las transacciones de JPA y desea utilizar uno si solo está realizando una transacción de JPA. El administrador de transacciones de JTA es un administrador de transacciones de propósito general y puede incorporar otros recursos como las colas JMS en la transacción. Normalmente, los contenedores Java EE emplean un administrador de transacciones JTA para EJB, entidades JPA, etc.

Chandra Patni
fuente
1

resource_local vs JTA se trata de transacciones locales vs transacciones globales. Se trata de si podemos gestionar varios recursos en una sola transacción.

CMT vs BMT se trata de quién abre y cierra la transacción: desarrollador de aplicaciones o servidor de aplicaciones.

Pushpendra
fuente