मेरे पास नीचे के रूप में प्रश्न हैं:
- इन दोनों में क्या अंतर है?
- क्या ये दोनों सभी डेटाबेस द्वारा समर्थित हैं?
- क्या JPA TransactionManager और JTA TransactionManager अलग हैं?
जवाबों:
जेपीए कार्यान्वयन में स्वयं लेनदेन के प्रबंधन का विकल्प है (RESOURCE_LOCAL
), या उन्हें एप्लिकेशन सर्वर के JTA कार्यान्वयन द्वारा प्रबंधित किया जाता है।
ज्यादातर मामलों में, RESOURCE_LOCAL ठीक है। यह बुनियादी जेडीबीसी स्तर के लेनदेन का उपयोग करेगा। नकारात्मक पक्ष यह है कि लेन-देन JPA दृढ़ता इकाई के लिए स्थानीय है, इसलिए यदि आप एक ऐसा लेनदेन चाहते हैं जो कई दृढ़ता इकाइयों (या अन्य डेटाबेस) तक फैला हो, तो RESOURCE_LOCAL पर्याप्त नहीं हो सकता है।
JTA का उपयोग JMS और JCA जैसी प्रणालियों में लेनदेन के प्रबंधन के लिए भी किया जाता है, लेकिन यह हम में से अधिकांश के लिए काफी विदेशी उपयोग है।
JTA का उपयोग करने के लिए, आपको अपने एप्लिकेशन सर्वर में इसके लिए समर्थन की आवश्यकता है, और JDBC ड्राइवर से भी समर्थन चाहिए।
अन्य उत्तरों के अतिरिक्त
यहां अत्यंत उपयोगी लेख ( Apache TomEE वेबसाइट पर प्रकाशित ) का एक अंश है , जो OP के पहले प्रश्न (लेख का लिंक नीचे है) का उत्तर देने में मदद कर सकता है।
RESOURCE_LOCAL और JTA दृढ़ता संदर्भों की तुलना करना
साथ <हठ इकाई के लेन-देन प्रकार = "RESOURCE_LOCAL"> आप EntityManager (PersistenceContext / कैश) बनाने और ट्रैकिंग के लिए जिम्मेदार हैं ...
- आप चाहिए का उपयोग EntityManagerFactory एक EntityManager पाने के लिए
- जिसके परिणामस्वरूप EntityManager उदाहरण है एक PersistenceContext / कैश
- एक EntityManagerFactory केवल @PersistenceUnit एनोटेशन के माध्यम से इंजेक्ट किया जा सकता है (@PersistenceContext नहीं)
- आपको RESOURCE_LOCAL प्रकार की एक इकाई को संदर्भित करने के लिए @PersistenceContext का उपयोग करने की अनुमति नहीं है
- आप चाहिए का उपयोग EntityTransaction शुरू / चारों ओर प्रतिबद्ध करने के लिए एपीआई हर अपने EntityManger करने के लिए कॉल
- UnitManagerFactory.createEntityManager () को दो अलग-अलग EntityManager उदाहरणों में दो बार परिणाम मिलता है और इसके बाद दो अलग-अलग PersistenceContexts / Caches होते हैं।
- यह है लगभग कभी एक से अधिक है करने के लिए एक अच्छा विचार उदाहरण उपयोग में एक EntityManager की (जब तक आप पहले नष्ट कर दिया है एक दूसरे से एक बना नहीं है)
साथ <हठ इकाई के लेन-देन प्रकार = "JTA"> CONTAINER EntityManager (PersistenceContext / कैश) बनाने और ट्रैकिंग करना होगा ...
- आप EntityManagerFactory का उपयोग नहीं कर सकते हैं का एक EntityManager पाने के लिए
- आप केवल कंटेनर द्वारा आपूर्ति की गई एक एंटिटी मैनजर प्राप्त कर सकते हैं
- एक EntityManager को केवल @PersistenceContext एनोटेशन के माध्यम से इंजेक्ट किया जा सकता है (@PersistenceUnit नहीं)
- आपको JTA की एक इकाई को संदर्भित करने के लिए @PersistenceUnit का उपयोग करने की अनुमति नहीं है
- EntityManager कंटेनर द्वारा दिए गए एक है संदर्भ एक JTA लेन-देन से जुड़े PersistenceContext / कैश करने के लिए।
- यदि कोई JTA लेनदेन प्रगति पर है, तो EntityManager का उपयोग नहीं किया जा सकता क्योंकि कोई PersistenceContext / Cache नहीं है।
- एक ही लेनदेन में एक इकाई के लिए एक EntityManager संदर्भ के साथ हर कोई स्वचालित रूप से एक संदर्भ होगा ही PersistenceContext / Cache का
- PersistenceContext / Cache को JTA कमिट समय में फ्लश और साफ़ किया जाता है
जावा पर्सिस्टेंस एपीआई को सीखने में दिलचस्पी रखने वाले किसी भी व्यक्ति - कृपया अपने आप को एक एहसान करें और यहां पूरा लेख पढ़ें: जेपीए अवधारणाओं: जेपीए 101 ।
transaction-type=RESOURCE_LOCAL
और @PersistenceContext
और @Transactional
वसंत द्वारा प्रबंधित
Resource_Local और JTA लेनदेन प्रबंधक (लेनदेन करने के तरीके) हैं। यह डेटाबेस की संपत्ति नहीं है, बल्कि लेनदेन के समन्वय के लिए जिम्मेदार घटक है। जेपीए और जेटीए लेनदेन प्रबंधक अलग-अलग हैं। JPA लेन-देन प्रबंधक JPA लेनदेन के लिए जिम्मेदार होता है और आप एक का उपयोग करना चाहते हैं यदि आप केवल JPA लेनदेन कर रहे हैं। जेटीए लेनदेन प्रबंधक सामान्य प्रयोजन लेनदेन प्रबंधक है और लेनदेन में जेएमएस कतारों जैसे अन्य संसाधनों को सूचीबद्ध कर सकता है। आमतौर पर जावा ईई कंटेनर ईजेबी, जेपीए संस्थाओं आदि के लिए एक जेटीए लेनदेन प्रबंधक को नियुक्त करते हैं।
रिसोर्स_लोकल बनाम जेटीए स्थानीय लेनदेन बनाम वैश्विक लेनदेन के बारे में। यह है कि हम एक ही लेनदेन के तहत कई संसाधनों का प्रबंधन कर सकते हैं।
सीएमटी बनाम बीएमटी इसके बारे में है कि लेनदेन कौन खोल रहा है और बंद कर रहा है - एप्लिकेशन डेवलपर या एप्लिकेशन सर्वर।