หน่วยความคงอยู่เป็น RESOURCE_LOCAL หรือ JTA?


87

ฉันมีคำถามดังนี้:

  1. ความแตกต่างของสองคนนี้คืออะไร?
  2. ฐานข้อมูลทั้งหมดรองรับหรือไม่
  3. JPA TransactionManager และ JTA TransactionManager แตกต่างกันหรือไม่

คำตอบ:


102

การใช้งาน JPA มีทางเลือกในการจัดการธุรกรรมด้วยตนเอง ( RESOURCE_LOCAL) หรือให้จัดการโดยการใช้ JTA ของแอปพลิเคชันเซิร์ฟเวอร์

ในกรณีส่วนใหญ่ RESOURCE_LOCAL นั้นใช้ได้ สิ่งนี้จะใช้ธุรกรรมระดับ JDBC พื้นฐาน ข้อเสียคือธุรกรรมเป็นแบบโลคัลของหน่วยการคงอยู่ของ JPA ดังนั้นหากคุณต้องการธุรกรรมที่ครอบคลุมหน่วยการคงอยู่หลายหน่วย (หรือฐานข้อมูลอื่น) RESOURCE_LOCAL อาจไม่ดีพอ

JTA ยังใช้ในการจัดการธุรกรรมข้ามระบบเช่น JMS และ JCA แต่นั่นเป็นการใช้งานที่ค่อนข้างแปลกใหม่สำหรับพวกเราส่วนใหญ่

ในการใช้ JTA คุณต้องมีการสนับสนุนในแอ็พพลิเคชันเซิร์ฟเวอร์ของคุณและยังรองรับจากไดรเวอร์ JDBC


3
ดูเหมือนว่า glassfih ไม่อนุญาตให้ฉันใช้ resource_local - ฉันจะทำเช่นนั้นได้อย่างไร
Pete_ch

3
ขณะที่ทราบด้าน: หนึ่งยังสามารถได้รับการทำงาน JTA แม้ไม่มีแอพพลิเคชันเซิร์ฟเวอร์ Java EE เต็มรูปแบบโดยใช้โซลูชั่นของบุคคลที่สามอย่างเช่นAtomikos ดังนั้นคุณสามารถมีเว็บคอนเทนเนอร์น้ำหนักเบาเช่น Tomcat และยังคงได้รับการสนับสนุน JTA
informatik01

84

นอกเหนือจากคำตอบอื่น ๆ

นี่คือข้อความที่ตัดตอนมาจากบทความที่มีประโยชน์อย่างยิ่ง (เผยแพร่บนเว็บไซต์Apache TomEE ) ซึ่งสามารถช่วยตอบคำถามแรกของ OP ได้ (ลิงก์ไปยังบทความด้านล่าง)


การเปรียบเทียบบริบทความคงอยู่ของ RESOURCE_LOCAL และ JTA


ด้วย<persistence-unit transaction-type = "RESOURCE_LOCAL"> คุณเป็นผู้รับผิดชอบในการสร้างและติดตาม EntityManager (PersistenceContext / Cache) ...

  • คุณต้องใช้ EntityManagerFactoryเพื่อรับ EntityManager
  • อินสแตนซ์ EntityManager ที่เป็นผลลัพธ์คือ PersistenceContext / Cache
  • EntityManagerFactoryสามารถฉีดผ่านทาง @PersistenceUnitคำอธิบายประกอบเท่านั้น (ไม่ @PersistenceContext)
  • คุณไม่ได้รับอนุญาตให้ใช้ @PersistenceContext เพื่ออ้างถึงหน่วยประเภท RESOURCE_LOCAL
  • คุณต้องใช้ EntityTransaction API เพื่อเริ่ม / คอมมิต ทุกครั้งที่เรียก EntityManger ของคุณ
  • การเรียก entityManagerFactory.createEntityManager () สองครั้งจะทำให้เกิด อินสแตนซ์ EntityManager สองอินสแตนซ์ที่แยกจากกันและสำหรับ PersistenceContexts / Caches ที่แยกจากกันสองอินสแตนซ์
  • มันเป็นเกือบจะไม่เคยมีความคิดที่ดีที่จะมีมากกว่าหนึ่ง อินสแตนซ์ของ EntityManager ในการใช้งาน (ไม่ได้สร้างคนที่สองถ้าคุณไม่ได้ทำลายคนแรก)


ด้วย<ติดตาหน่วยธุรกรรมประเภท = "JTA"> CONTAINERจะทำ EntityManager (PersistenceContext / Cache) การสร้างและการติดตาม ...

  • คุณไม่สามารถใช้ EntityManagerFactoryเพื่อรับ EntityManager
  • คุณจะได้รับEntityManagerจาก คอนเทนเนอร์เท่านั้น
  • EntityManager สามารถฉีดผ่านทาง@PersistenceContext คำอธิบายประกอบเท่านั้น (ไม่ @PersistenceUnit)
  • คุณ ไม่ได้รับอนุญาตให้ใช้ @PersistenceUnit เพื่ออ้างถึงหน่วยประเภท JTA
  • EntityManagerกำหนดโดยภาชนะที่เป็นการอ้างอิงไปยัง / แคช PersistenceContext ที่เกี่ยวข้องกับการทำธุรกรรม JTA
  • หากไม่มีธุรกรรม JTA อยู่ระหว่างดำเนินการจะไม่สามารถใช้ EntityManager ได้เนื่องจากไม่มี PersistenceContext / Cache
  • ทุกคนที่มีการอ้างอิง EntityManager ไปยังหน่วยเดียวกันในธุรกรรมเดียวกันจะมีการอ้างอิงไปยังPersistenceContext / Cache เดียวกันโดยอัตโนมัติ
  • PersistenceContext / Cache จะล้างและล้างที่เวลาคอมมิต JTA

ทุกคนที่สนใจในการเรียนรู้ Java Api คงทน - โปรดทำด้วยตัวเองชอบและอ่านบทความเต็มรูปแบบที่นี่: แนวคิด JPA: JPA 101


8
แค่ต้องการเพิ่มจุดเดียว: หากคุณใช้ Spring คุณสามารถใช้ @ PersistenceContext และ EntityManager กับ Resource_Local ในกรณีนี้คอนเทนเนอร์ Spring สามารถจัดการธุรกรรมโดยใช้คำอธิบายประกอบ @ Transactional
แซม

ในโครงการของฉันtransaction-type=RESOURCE_LOCALและ@PersistenceContextและ@Transactionalจัดการโดยฤดูใบไม้ผลิ
ราวี Parekh

ฉันตีสามเหลี่ยมหงายขึ้นเนื่องจากลิงค์ที่คุณให้มา
Koray Tugay

@KorayTugay ฉันขอโทษฉันไม่เข้าใจในสิ่งที่คุณพูดสามเหลี่ยมอะไร
informatik01

1
@LinuRadu คำตอบนี้อาจเป็นประโยชน์สำหรับคุณ: การใช้ session.flush () ใน Hibernate คืออะไร
informatik01

18

Resource_Local และ JTA คือตัวจัดการธุรกรรม (วิธีการทำธุรกรรม) นี่ไม่ใช่คุณสมบัติของฐานข้อมูล แต่เป็นส่วนประกอบที่รับผิดชอบในการประสานธุรกรรม ผู้จัดการธุรกรรม JPA และ JTA แตกต่างกัน ผู้จัดการธุรกรรม JPA รับผิดชอบธุรกรรม JPA และคุณต้องการใช้หากคุณทำธุรกรรม JPA เท่านั้น ตัวจัดการธุรกรรม JTA เป็นผู้จัดการธุรกรรมทั่วไปและสามารถขอทรัพยากรอื่น ๆ เช่นคิว JMS ในการทำธุรกรรม โดยทั่วไปคอนเทนเนอร์ Java EE จะใช้ตัวจัดการธุรกรรม JTA สำหรับ EJBs, เอนทิตี JPA เป็นต้น


1

resource_local เทียบกับ JTA เกี่ยวกับธุรกรรมท้องถิ่นเทียบกับธุรกรรมทั่วโลก เราสามารถจัดการทรัพยากรหลายอย่างภายใต้ธุรกรรมเดียวได้

CMT เทียบกับ BMT เกี่ยวกับผู้ที่เปิดและปิดธุรกรรม - ผู้พัฒนาแอปพลิเคชันหรือเซิร์ฟเวอร์แอปพลิเคชัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.