RESOURCE_LOCAL veya JTA olarak kalıcılık birimi?


87

Aşağıdaki gibi sorularım var:

  1. Bu ikisinin farkı nedir?
  2. Bunların her ikisi de tüm veritabanları tarafından destekleniyor mu?
  3. JPA TransactionManager ve JTA TransactionManager farklı mı?

Yanıtlar:


101

JPA uygulamaları, işlemleri kendi başlarına yönetme ( RESOURCE_LOCAL) veya uygulama sunucusunun JTA uygulaması tarafından yönetilme seçeneğine sahiptir.

Çoğu durumda RESOURCE_LOCAL iyidir. Bu, temel JDBC düzeyindeki işlemleri kullanır. Olumsuz yanı, işlemin JPA kalıcılık birimi için yerel olmasıdır, bu nedenle birden fazla kalıcı birimi (veya diğer veritabanlarını) kapsayan bir işlem istiyorsanız, RESOURCE_LOCAL yeterince iyi olmayabilir.

JTA ayrıca JMS ve JCA gibi sistemlerdeki işlemleri yönetmek için kullanılır, ancak bu çoğumuz için oldukça egzotik bir kullanımdır.

JTA'yı kullanmak için, uygulama sunucunuzda bunun için desteğe ve ayrıca JDBC sürücüsünden desteğe ihtiyacınız vardır.


3
Görünüşe göre glassfih resource_local kullanmama izin vermiyor - bunu nasıl yapabilirim?
Pete_ch

3
Bir yan not olarak: Tam bir Java EE uygulama sunucusu olmasa bile, örneğin Atomikos gibi üçüncü taraf çözümleri kullanarak JTA işlevselliği elde edilebilir . Böylece Tomcat gibi hafif bir web konteynırınız olabilir ve yine de JTA desteğini alabilirsiniz.
informatik01

84

Diğer cevaplara ek olarak

İşte son derece yararlı makaleden ( Apache TomEE web sitesinde yayınlanan ), OP'nin ilk sorusunu yanıtlamaya da yardımcı olabilecek bir alıntı (makalenin bağlantısı aşağıdadır).


RESOURCE_LOCAL ve JTA kalıcılık bağlamlarının karşılaştırılması


İle <kalıcılık birimi işlem-type = "RESOURCE_LOCAL"> SİZİN EntityManager (PersistenceContext / Önbellek) oluşturma ve izleme sorumludur ...

  • Bir EntityManager almak için EntityManagerFactory'yi kullanmanız gerekir
  • Elde edilen EntityManager örneği olan bir PersistenceContext / Önbellek
  • Bir EntityManagerFactory yalnızca @PersistenceUnit ek açıklaması aracılığıyla enjekte edilebilir (@PersistenceContext değil)
  • Sen edilir değil türde bir birimine bakın @PersistenceContext kullanmasına izin RESOURCE_LOCAL
  • Sen gerekir kullanmak EntityTransaction / başlamak etrafında işlemeye API her sizin EntityManger çağrısı
  • EntityManagerFactory.createEntityManager () öğesinin iki kez çağrılması, iki ayrı EntityManager örneği ve bu nedenle iki ayrı PersistenceContexts / Caches ile sonuçlanır .
  • Birden fazla EntityManager örneğinin kullanımda olması neredeyse hiçbir zaman iyi bir fikir değildir (ilkini yok etmedikçe ikinci bir tane oluşturmayın)


İle <kalıcılık birimi işlem-type = "JTA"> KONTEYNER EntityManager (PersistenceContext / Önbellek) oluşturma ve izleme yapacak ...

  • Sen olamaz kullanmak EntityManagerFactory bir EntityManager almak
  • Yalnızca konteyner tarafından sağlanan bir EntityManager alabilirsiniz
  • Bir EntityManager yalnızca @PersistenceContext ek açıklaması aracılığıyla enjekte edilebilir (@PersistenceUnit değil)
  • Sen edilir değil tip JTA bir birimine bakın @PersistenceUnit kullanmasına izin
  • EntityManager kabı tarafından verilen bir referans bir JTA işlem ile bağlantılı PersistenceContext / Önbellek.
  • Devam eden bir JTA işlemi yoksa, PersistenceContext / Cache olmadığından EntityManager kullanılamaz .
  • Bir EntityManager referansla Herkes aynı birimin içinde aynı işlem otomatik bir başvuru olacaktır aynı PersistenceContext / Önbellek
  • PersistenceContext / Cache, JTA commit zamanında temizlenir ve temizlenir

Java Persistence API'yi öğrenmek isteyenler - lütfen kendinize bir iyilik yapın ve makalenin tamamını buradan okuyun: JPA Concepts: JPA 101 .


8
Sadece bir nokta eklemek istedim: Spring kullanıyorsanız @ PersistenceContext ve EntityManager'ı Resource_Local ile kullanabilirsiniz. Bu durumda Spring konteyneri, @ Transactional annotation kullanarak işlemi yönetebilir.
Sam

Projemde transaction-type=RESOURCE_LOCALve @PersistenceContextve @TransactionalBahar tarafından yönetilen
Ravi Parekh

Sağladığınız bağlantı nedeniyle yukarı bakan üçgeni vuruyorum.
Koray Tugay

@KorayTugay Üzgünüm, ne dediğini tam olarak anlamadım, hangi üçgen?
informatik01

1
@LinuRadu Bu cevap sizin için yararlı olabilir: Hazırda bekletmede session.flush () kullanımı nedir
informatik01

18

Resource_Local ve JTA işlem yöneticileridir (işlem yapma yöntemleri). Bu, veritabanının özelliği değil, işlemleri koordine etmekten sorumlu bileşendir. JPA ve JTA işlem yöneticileri farklıdır. JPA işlem yöneticisi, JPA işlemlerinden sorumludur ve yalnızca JPA işlemi yapıyorsanız bir tane kullanmak istersiniz. JTA işlem yöneticisi, genel amaçlı işlem yöneticisidir ve işlemdeki JMS kuyrukları gibi diğer kaynakları kaydedebilir. Genellikle Java EE kapsayıcıları, EJB'ler, JPA varlıkları vb. İçin bir JTA işlem yöneticisi kullanır.


1

resource_local - JTA, yerel işlem ve küresel işlem hakkında. Tek bir işlem altında birden fazla kaynağı yönetebilir miyiz?

CMT vs BMT, işlemi kimin açıp kapattığıyla ilgilidir - uygulama geliştiricisi veya uygulama sunucusu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.