2010-07-10 27 views
49

"jta-datasource" ve "resource-local datasource" terimleri benim için biraz belirsiz. Neyi anladığımı (veya varsaydığımı) söylüyorum ve doğru/yanlış olduğumu söylemeni istiyorum. JTA-veri kaynağı olarak belirtilen Eğer Bir "jta veri kaynağı" ve "kaynak yerel" veri kaynağı arasındaki fark?

  • aynı veritabanı

    sonra fasulye/diğer sınıfları JTA kullanabilir,
  • bir JTA-veri kaynağı olarak ya da bir kaynak yerel veri kaynağı olarak ifade edilebilir. veri kaynağı kaynak yerel veri kaynağı olarak belirtilen Eğer
  • yerel kaynak ise Dolayısıyla, UserTransaction arayüzü
  • CMT/BMT kullanılamaz, işlemler JTA farkında değildir. Kod EntityTransaction arabirimini kullanabilir, ancak UserTransaction arabirimini kullanamazsınız KullanıcıTransaction arabirimi

Teşekkürler!

cevap

62

"jta-datasource" ve "resouce-local veri kaynağı" terimleri benim için biraz belirsiz.

Aslında, jta-datasource ve non-jta-datasource öğelerine başvurursunuz. Kısaca:

  • sebat birimi işlem türü jta-datasource eleman bağlantıları elde etmek üzere kullanılacak olan JTA veri kaynağının Jndi adı bildirmek için kullanılır, JTA ise. Bu yaygın bir durumdur.
  • Kalıcı birim işlem türü kaynak yerel ise, non-jta-data-source, JTA olmayan bir veri kaynağının JNDI adını bildirmek için kullanılmalıdır.
  • aynı veritabanı bir JTA-veri kaynağı olarak ya da bir kaynak yerel veri kaynağı

Bu doğru şu şekilde ifade edilebilir. Ve sadece yukarıda bahsetmedim ama bazı sağlayıcılar, ve ve ve non-jta-datasource bildirme izni vermeyi ve daha sonra JTA olmayan bağlantılar aracılığıyla (örneğin, devam eden bir JTA işlemi ile ilişkilendirilmeyecek) optimize edilmiş okumayı kullanmaya bile izin verirler. .

JTA-veri kaynağı olarak belirtilen Eğer
  • , daha sonra fasulye/diğer sınıfları JTA kullanabilir. Bu nedenle, UserTransaction arayüzü. Birinci bölüm doğru

, son bölümü olarak değil. EJB 3.0 spec itibaren Konteyner Yönetilen İşlem çizilmesine Kullanılması bölüm 13.3.4 Kurumsal Fasulye:

kurumsal fasulyesi iş yöntemleri [...] elde etmeye veya javax.transaction.UserTransaction arayüzü kullanmak yasaktır.

Ve bölüm 16.12 UserTransaction Arayüz: konteyner bu arayüzü kullanmak için izin verilmez kurumsal fasulye UserTransaction arayüz kullanılabilir hale olmamalıdır

. Başka bir deyişle, UserTransaction arabirimi, CMT kuruluş fasulyeleri için geçerli değildir. veri kaynağı

ifadeler yerel kaynak burada biraz kafa karıştırıcı olduğunu ise

  • CMT/BMT kullanılamaz ama bu kesinlikle doğru bu değil derdim. JPA 1.0 tarifhamesinden, bölüm § 5.5 İşlemler Kontrol:

    bir uygulama tarafından yönetilen işletme yöneticisi JTA işletme yöneticisi veya kaynak yerel işletme yöneticisi olabilmektedir.

    ...

    İkisi JTA varlık yöneticileri ve kaynak yerel varlık yöneticileri, Java EE web kapları ve EJB kaplarda desteklenmesi gerekmektedir. Bir EJB ortamında, tipik olarak bir JTA varlık yöneticisi kullanılır.

    Ve bölüm 6.2.1.2 işlem tipi

    transaction-type nitelik sebat birimi için varlık yöneticisi fabrikaya tarafından sağlanan varlık yöneticileri JTA varlık yöneticileri veya kaynak olması gerekip gerekmediğini belirtmek için kullanılır - mal varlık yöneticileri. Bu öğenin değeri JTA veya RESOURCE_LOCAL'dur. Bir JTA işlem türü, JTA veri kaynağının sağlanacağını varsayar - jta-data-source öğesi tarafından belirtildiği gibi veya kapsayıcı tarafından sağlanır. Genel olarak, Java EE ortamlarında, RESOURCE_LOCAL numaralı transaction-type, JTA dışı bir veri kaynağının sağlanacağını varsayar. Bir Java EE ortamında, bu eleman belirtilmezse, varsayılan JTA'dır.

    Yani (eğer bu durumda ondan EM almak için bir EntityManagerFactory enjekte olmalıdır) bir kaynak yerel varlık yöneticisi olabilir varlık yöneticisi yönetilen bir uygulamasını kullanmak CAN ve olmayacak JTA işleminin bir parçası. Bkz this (very interesting) discussion.

    kaynak yerel veri kaynağı olarak belirtilen Eğer
    • , işlemler farkında değildir JTA vardır. Kod Yine EntityTransaction arayüzünü değil UserTransaction arayüzünü

    kullanabilirsiniz, ifadeler kafa karıştırıcı biraz ama bu doğru olduğunu söyleyebilirim.

+0

Merhaba, Zaman ayırdığınız ve açıkladığınız için çok teşekkür ederim! Şimdi "kaynak yerel veri kaynağını" değil "kaynak yerel EntityManager" terimini kullandığımızı görüyorum. Evet "kaynak yerel veri kaynağı" dediğimde jta-veri kaynağı demek istemedim. Şu an anladığım kadarıyla: JTA/RESOURCE_LOCAL -> EntityManager'ın İşlem Türü. Temel işlemi kimin kontrol ettiğini belirler. JTA/EntityTransaction API'sı JTA EntityManger: Kapsayıcı bu EntityManager'ı yönetir. JTA işlemlerinde yer alır. Bir JTA işlemi, bir CMT veya BMT olabilir. Yönetilen sınıflarda kullanılabilir. – stratwine

+0

Kaynak Yerel EntityManager: EnityManager, kapsayıcı tarafından yönetilmez. JTA olmayan işlemlerde içerir. EntityTransaction API'si kullanılır. POJOs BMT için kullanabilir miyim, UserTransaction hep JTA-veri kaynağı kullanır ve çok KMT nedeniyle Aynı şekilde olmayan bir JTA-veri kaynağı kullanamaz, konteyner sadece – stratwine

+1

@stratwine bir JTA-veri kaynağı kullanabilirsiniz: Bir şey değil , yararlı bulduğunuz (ve anlayışınız doğru görünüyor). İfadeyle ilgili olarak, seçici olmayı istemedim, ancak spekülasyon çok hassas (ve ince) bir terminolojiyi tanımladığından, onu kullanarak iletişimi kolaylaştırır, bu yüzden bu konuda biraz ısrar ettim (ve okumayı tavsiye ederim) kısmen alıntı yaptığım bölümler). –

İlgili konular