Unidade de persistência como RESOURCE_LOCAL ou JTA?

86

Tenho as seguintes perguntas:

  1. Qual é a diferença entre esses dois?
  2. Ambos são suportados por todos os bancos de dados?
  3. JPA TransactionManager e JTA TransactionManager são diferentes?
cometta
fonte

Respostas:

101

As implementações JPA têm a opção de gerenciar as próprias transações ( RESOURCE_LOCAL) ou gerenciá-las pela implementação JTA do servidor de aplicativos.

Na maioria dos casos, RESOURCE_LOCAL é adequado. Isso usaria transações básicas de nível JDBC. A desvantagem é que a transação é local para a unidade de persistência JPA, portanto, se você deseja uma transação que abrange várias unidades de persistência (ou outros bancos de dados), RESOURCE_LOCAL pode não ser bom o suficiente.

JTA também é usado para gerenciar transações em sistemas como JMS e JCA, mas é um uso bastante exótico para a maioria de nós.

Para usar JTA, você precisa de suporte para ele em seu servidor de aplicativos e também de suporte do driver JDBC.

skaffman
fonte
3
parece que o glassfih não me permite usar resource_local - como posso fazer isso?
Pete_ch
3
Como nota lateral: ainda é possível obter a funcionalidade JTA, mesmo sem um servidor de aplicativos Java EE completo, usando soluções de terceiros, como por exemplo Atomikos . Portanto, você pode ter um contêiner da web leve como o Tomcat e ainda obter o suporte JTA.
informatik01
83

Além de outras respostas

Aqui está um trecho do artigo extremamente útil (publicado no site do Apache TomEE ), que também pode ajudar a responder à primeira pergunta do OP (o link para o artigo está abaixo).


Comparando os contextos de persistência RESOURCE_LOCAL e JTA


Com <persistence-unit transaction-type = "RESOURCE_LOCAL"> VOCÊ é responsável pela criação e rastreamento de EntityManager (PersistenceContext / Cache) ...

  • Você deve usar o EntityManagerFactory para obter um EntityManager
  • A instância EntityManager resultante é um PersistenceContext / Cache
  • Um EntityManagerFactory pode ser injetado apenas por meio da anotação @PersistenceUnit (não por @PersistenceContext)
  • Você não tem permissão para usar @PersistenceContext para se referir a uma unidade do tipo RESOURCE_LOCAL
  • Você deve usar a API EntityTransaction para iniciar / confirmar cada chamada para o seu EntityManger
  • Chamar entityManagerFactory.createEntityManager () duas vezes resulta em duas instâncias EntityManager separadas e, portanto, dois PersistenceContexts / Caches separados.
  • É não quase uma boa idéia ter mais de uma instância de um EntityManager em uso (não criar um segundo a menos que você destruiu o primeiro)


Com <persistence-unit transaction-type = "JTA"> o CONTAINER fará EntityManager (PersistenceContext / Cache) criando e rastreando ...

  • Você não pode usar o EntityManagerFactory para obter um EntityManager
  • Você só pode obter um EntityManager fornecido pelo contêiner
  • Um EntityManager pode ser injetado apenas por meio da anotação @PersistenceContext (não por @PersistenceUnit)
  • Você não tem permissão para usar @PersistenceUnit para se referir a uma unidade do tipo JTA
  • O EntityManager fornecido pelo contêiner é uma referência ao PersistenceContext / Cache associado a uma transação JTA.
  • Se nenhuma transação JTA estiver em andamento, o EntityManager não pode ser usado porque não há PersistenceContext / Cache.
  • Todos com uma referência EntityManager à mesma unidade na mesma transação terão automaticamente uma referência ao mesmo PersistenceContext / Cache
  • O PersistenceContext / Cache é liberado e limpo no tempo de confirmação do JTA

Qualquer pessoa interessada em aprender a Java Persistence API - faça um favor a si mesmo e leia o artigo completo aqui: Conceitos de JPA: JPA 101 .

informatik01
fonte
8
Só queria adicionar um ponto: se você estiver usando Spring, pode usar @ PersistenceContext e EntityManager com Resource_Local. Nesse caso, o contêiner Spring pode gerenciar a transação usando a anotação @Transactional.
Sam
No meu projeto transaction-type=RESOURCE_LOCALe @PersistenceContexte @Transactionalgerido pela Primavera
Ravi Parekh
Estou acertando o triângulo voltado para cima por causa do link que você forneceu.
Koray Tugay
@KorayTugay me desculpe, não entendi bem o que você disse, que triângulo?
informatik01
1
@LinuRadu Esta resposta pode ser útil para você: Qual é a utilidade de session.flush () no Hibernate
informatik01
18

Resource_Local e JTA são gerenciadores de transações (métodos de fazer transações). Esta não é propriedade do banco de dados, mas o componente responsável por coordenar as transações. Os gerenciadores de transações JPA e JTA são diferentes. O gerenciador de transações JPA é responsável pelas transações JPA e você deseja usar um se estiver apenas fazendo transações JPA. O gerenciador de transações JTA é um gerenciador de transações de propósito geral e pode alistar outros recursos, como filas JMS na transação. Normalmente, os contêineres Java EE empregam um gerenciador de transações JTA para EJBs, entidades JPA, etc.

Chandra Patni
fonte
1

resource_local vs JTA é sobre transação local vs transação global. É sobre como podemos gerenciar vários recursos em uma única transação.

CMT vs BMT trata de quem está abrindo e fechando a transação - desenvolvedor de aplicativos ou servidor de aplicativos.

Pushpendra
fonte