Persistensi unit sebagai RESOURCE_LOCAL atau JTA?

87

Saya punya pertanyaan seperti di bawah ini:

  1. Apa perbedaan dari keduanya?
  2. Apakah keduanya didukung oleh semua database?
  3. Apakah JPA TransactionManager dan JTA TransactionManager berbeda?
cometta
sumber

Jawaban:

101

Implementasi JPA memiliki pilihan untuk mengelola transaksi itu sendiri ( RESOURCE_LOCAL), atau membuatnya dikelola oleh implementasi JTA server aplikasi.

Dalam kebanyakan kasus, RESOURCE_LOCAL baik-baik saja. Ini akan menggunakan transaksi tingkat JDBC dasar. Sisi negatifnya adalah bahwa transaksi tersebut bersifat lokal untuk unit persistensi JPA, jadi jika Anda menginginkan transaksi yang mencakup beberapa unit persistensi (atau database lain), RESOURCE_LOCAL mungkin tidak cukup baik.

JTA juga digunakan untuk mengelola transaksi di seluruh sistem seperti JMS dan JCA, tetapi itu adalah penggunaan yang cukup eksotis bagi kebanyakan dari kita.

Untuk menggunakan JTA, Anda memerlukan dukungannya di server aplikasi Anda, dan juga dukungan dari driver JDBC.

skaffman
sumber
3
tampaknya glassfih tidak mengizinkan saya menggunakan resource_local - bagaimana saya bisa melakukannya?
Pete_ch
3
Sebagai catatan tambahan: seseorang masih bisa mendapatkan fungsionalitas JTA, bahkan tanpa server aplikasi Java EE lengkap dengan menggunakan solusi pihak ketiga, seperti misalnya Atomikos . Jadi Anda bisa memiliki wadah web ringan seperti Tomcat dan tetap mendapatkan dukungan JTA.
informatik01
84

Sebagai tambahan jawaban lainnya

Berikut adalah kutipan dari artikel yang sangat berguna (diterbitkan di situs web Apache TomEE ), yang juga dapat membantu menjawab pertanyaan pertama OP (tautan ke artikel ada di bawah).


Membandingkan konteks persistensi RESOURCE_LOCAL dan JTA


Dengan <persistence-unit transaction-type = "RESOURCE_LOCAL"> ANDA bertanggung jawab atas pembuatan dan pelacakan EntityManager (PersistenceContext / Cache) ...

  • Anda harus menggunakan EntityManagerFactory untuk mendapatkan EntityManager
  • Instance EntityManager yang dihasilkan adalah PersistenceContext / Cache
  • Sebuah EntityManagerFactory dapat disuntikkan melalui @PersistenceUnit penjelasan saja (tidak @PersistenceContext)
  • Anda tidak diizinkan menggunakan @PersistenceContext untuk merujuk ke unit berjenis RESOURCE_LOCAL
  • Anda harus menggunakan EntityTransaction API untuk memulai / melakukan setiap panggilan ke EntityManger Anda
  • Memanggil entityManagerFactory.createEntityManager () dua kali menghasilkan dua instance EntityManager yang terpisah dan karenanya dua PersistenceContexts / Cache terpisah.
  • Hal ini hampir tidak pernah ide yang baik untuk memiliki lebih dari satu contoh dari EntityManager digunakan (tidak membuat kedua kecuali Anda telah menghancurkan pertama)


Dengan <ketekunan unit transaksi-type = "JTA"> yang CONTAINER akan melakukan EntityManager (PersistenceContext / Cache) menciptakan dan pelacakan ...

  • Anda tidak dapat menggunakan EntityManagerFactory untuk mendapatkan EntityManager
  • Anda hanya bisa mendapatkan EntityManager yang disediakan oleh penampung
  • Sebuah EntityManager dapat disuntikkan melalui @PersistenceContext penjelasan saja (tidak @PersistenceUnit)
  • Anda tidak diizinkan menggunakan @PersistenceUnit untuk merujuk ke unit berjenis JTA
  • The EntityManager diberikan oleh wadah adalah referensi ke PersistenceContext / Cache terkait dengan JTA Transaksi.
  • Jika tidak ada transaksi JTA yang sedang berlangsung, EntityManager tidak dapat digunakan karena tidak ada PersistenceContext / Cache.
  • Setiap orang yang memiliki referensi EntityManager ke unit yang sama dalam transaksi yang sama akan secara otomatis memiliki referensi ke PersistenceContext / Cache yang sama
  • The PersistenceContext / Cache adalah memerah dan dibersihkan di JTA komit waktu

Siapa pun yang tertarik mempelajari Java Persistence API - bantulah diri Anda sendiri dan baca artikel lengkapnya di sini: Konsep JPA: JPA 101 .

informatik01
sumber
8
Hanya ingin menambahkan satu poin: Jika Anda menggunakan Spring, Anda dapat menggunakan @ PersistenceContext dan EntityManager dengan Resource_Local. Dalam hal ini wadah Spring dapat mengelola transaksi menggunakan @ Transactional annotation.
Sam
Dalam proyek saya transaction-type=RESOURCE_LOCALdan @PersistenceContextdan @Transactionaldikelola oleh Spring
Ravi Parekh
Saya memukul segitiga menghadap ke atas karena tautan yang Anda berikan.
Koray Tugay
@KorayTugay Maaf, saya tidak begitu mengerti apa yang Anda katakan, segitiga apa?
informatik01
1
@LinuRadu Jawaban ini mungkin berguna untuk Anda: Apa gunanya session.flush () di Hibernate
informatik01
18

Resource_Local dan JTA adalah manajer transaksi (metode melakukan transaksi). Ini bukan milik database tetapi komponen yang bertanggung jawab untuk mengkoordinasikan transaksi. Manajer transaksi JPA dan JTA berbeda. Manajer transaksi JPA bertanggung jawab atas transaksi JPA dan Anda ingin menggunakannya jika Anda hanya melakukan transaksi JPA. Manajer transaksi JTA adalah manajer transaksi tujuan umum dan dapat meminta sumber daya lain seperti antrian JMS dalam transaksi. Biasanya kontainer Java EE menggunakan manajer transaksi JTA untuk EJB, entitas JPA, dll.

Chandra Patni
sumber
1

resource_local vs JTA tentang transaksi lokal vs transaksi global. Ini tentang bisakah kita mengelola banyak sumber daya dalam satu transaksi.

CMT vs BMT tentang siapa yang membuka dan menutup transaksi - pengembang aplikasi atau server aplikasi.

Pushpendra
sumber