ฉันมีคำถามดังนี้:
- ความแตกต่างของสองคนนี้คืออะไร?
- ฐานข้อมูลทั้งหมดรองรับหรือไม่
- JPA TransactionManager และ JTA TransactionManager แตกต่างกันหรือไม่
ฉันมีคำถามดังนี้:
คำตอบ:
การใช้งาน JPA มีทางเลือกในการจัดการธุรกรรมด้วยตนเอง ( RESOURCE_LOCAL
) หรือให้จัดการโดยการใช้ JTA ของแอปพลิเคชันเซิร์ฟเวอร์
ในกรณีส่วนใหญ่ RESOURCE_LOCAL นั้นใช้ได้ สิ่งนี้จะใช้ธุรกรรมระดับ JDBC พื้นฐาน ข้อเสียคือธุรกรรมเป็นแบบโลคัลของหน่วยการคงอยู่ของ JPA ดังนั้นหากคุณต้องการธุรกรรมที่ครอบคลุมหน่วยการคงอยู่หลายหน่วย (หรือฐานข้อมูลอื่น) RESOURCE_LOCAL อาจไม่ดีพอ
JTA ยังใช้ในการจัดการธุรกรรมข้ามระบบเช่น JMS และ JCA แต่นั่นเป็นการใช้งานที่ค่อนข้างแปลกใหม่สำหรับพวกเราส่วนใหญ่
ในการใช้ JTA คุณต้องมีการสนับสนุนในแอ็พพลิเคชันเซิร์ฟเวอร์ของคุณและยังรองรับจากไดรเวอร์ JDBC
นอกเหนือจากคำตอบอื่น ๆ
นี่คือข้อความที่ตัดตอนมาจากบทความที่มีประโยชน์อย่างยิ่ง (เผยแพร่บนเว็บไซต์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
transaction-type=RESOURCE_LOCAL
และ@PersistenceContext
และ@Transactional
จัดการโดยฤดูใบไม้ผลิ
Resource_Local และ JTA คือตัวจัดการธุรกรรม (วิธีการทำธุรกรรม) นี่ไม่ใช่คุณสมบัติของฐานข้อมูล แต่เป็นส่วนประกอบที่รับผิดชอบในการประสานธุรกรรม ผู้จัดการธุรกรรม JPA และ JTA แตกต่างกัน ผู้จัดการธุรกรรม JPA รับผิดชอบธุรกรรม JPA และคุณต้องการใช้หากคุณทำธุรกรรม JPA เท่านั้น ตัวจัดการธุรกรรม JTA เป็นผู้จัดการธุรกรรมทั่วไปและสามารถขอทรัพยากรอื่น ๆ เช่นคิว JMS ในการทำธุรกรรม โดยทั่วไปคอนเทนเนอร์ Java EE จะใช้ตัวจัดการธุรกรรม JTA สำหรับ EJBs, เอนทิตี JPA เป็นต้น
resource_local เทียบกับ JTA เกี่ยวกับธุรกรรมท้องถิ่นเทียบกับธุรกรรมทั่วโลก เราสามารถจัดการทรัพยากรหลายอย่างภายใต้ธุรกรรมเดียวได้
CMT เทียบกับ BMT เกี่ยวกับผู้ที่เปิดและปิดธุรกรรม - ผู้พัฒนาแอปพลิเคชันหรือเซิร์ฟเวอร์แอปพลิเคชัน