RESOURCE_LOCAL या JTA के रूप में दृढ़ता इकाई?


87

मेरे पास नीचे के रूप में प्रश्न हैं:

  1. इन दोनों में क्या अंतर है?
  2. क्या ये दोनों सभी डेटाबेस द्वारा समर्थित हैं?
  3. क्या JPA TransactionManager और JTA TransactionManager अलग हैं?

जवाबों:


101

जेपीए कार्यान्वयन में स्वयं लेनदेन के प्रबंधन का विकल्प है (RESOURCE_LOCAL ), या उन्हें एप्लिकेशन सर्वर के JTA कार्यान्वयन द्वारा प्रबंधित किया जाता है।

ज्यादातर मामलों में, RESOURCE_LOCAL ठीक है। यह बुनियादी जेडीबीसी स्तर के लेनदेन का उपयोग करेगा। नकारात्मक पक्ष यह है कि लेन-देन JPA दृढ़ता इकाई के लिए स्थानीय है, इसलिए यदि आप एक ऐसा लेनदेन चाहते हैं जो कई दृढ़ता इकाइयों (या अन्य डेटाबेस) तक फैला हो, तो RESOURCE_LOCAL पर्याप्त नहीं हो सकता है।

JTA का उपयोग JMS और JCA जैसी प्रणालियों में लेनदेन के प्रबंधन के लिए भी किया जाता है, लेकिन यह हम में से अधिकांश के लिए काफी विदेशी उपयोग है।

JTA का उपयोग करने के लिए, आपको अपने एप्लिकेशन सर्वर में इसके लिए समर्थन की आवश्यकता है, और JDBC ड्राइवर से भी समर्थन चाहिए।


3
ऐसा लगता है कि ग्लासफिह मुझे संसाधन_लोक का उपयोग करने की अनुमति नहीं देता - मैं ऐसा कैसे कर सकता हूं?
पीट_च

3
एक साइड नोट के रूप में: एक अभी भी जेटीए कार्यक्षमता प्राप्त कर सकता है, यहां तक ​​कि तीसरे पक्ष के समाधानों का उपयोग करके पूर्ण जावा ईई एप्लिकेशन सर्वर के बिना, उदाहरण के लिए एटमिकोस । तो आपके पास Tomcat जैसा एक हल्का वेब कंटेनर हो सकता है और अभी भी JTA समर्थन प्राप्त कर सकता है।
informatik01

84

अन्य उत्तरों के अतिरिक्त

यहां अत्यंत उपयोगी लेख ( 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


8
बस एक बिंदु जोड़ना चाहता था: यदि आप स्प्रिंग का उपयोग कर रहे हैं, तो आप संसाधन Persocal के साथ @ PersistenceContext और EntityManager का उपयोग कर सकते हैं। इस स्थिति में स्प्रिंग कंटेनर @ ट्रांजेक्शनल एनोटेशन का उपयोग करके लेनदेन का प्रबंधन कर सकता है।
सैम

मेरी परियोजना में transaction-type=RESOURCE_LOCALऔर @PersistenceContextऔर @Transactionalवसंत द्वारा प्रबंधित
रवि पारेख

आपके द्वारा दिए गए लिंक के कारण मैं त्रिकोण का सामना कर रहा हूं।
कोरे तुगे

@KorayTugay मुझे खेद है, काफी समझ में नहीं आया कि आप क्या कहते हैं, क्या त्रिकोण?
informatik01

1
@LinuRadu इस उत्तर आप के लिए उपयोगी हो सकता है: क्या हाइबरनेट में session.flush () का उपयोग है
informatik01

18

Resource_Local और JTA लेनदेन प्रबंधक (लेनदेन करने के तरीके) हैं। यह डेटाबेस की संपत्ति नहीं है, बल्कि लेनदेन के समन्वय के लिए जिम्मेदार घटक है। जेपीए और जेटीए लेनदेन प्रबंधक अलग-अलग हैं। JPA लेन-देन प्रबंधक JPA लेनदेन के लिए जिम्मेदार होता है और आप एक का उपयोग करना चाहते हैं यदि आप केवल JPA लेनदेन कर रहे हैं। जेटीए लेनदेन प्रबंधक सामान्य प्रयोजन लेनदेन प्रबंधक है और लेनदेन में जेएमएस कतारों जैसे अन्य संसाधनों को सूचीबद्ध कर सकता है। आमतौर पर जावा ईई कंटेनर ईजेबी, जेपीए संस्थाओं आदि के लिए एक जेटीए लेनदेन प्रबंधक को नियुक्त करते हैं।


1

रिसोर्स_लोकल बनाम जेटीए स्थानीय लेनदेन बनाम वैश्विक लेनदेन के बारे में। यह है कि हम एक ही लेनदेन के तहत कई संसाधनों का प्रबंधन कर सकते हैं।

सीएमटी बनाम बीएमटी इसके बारे में है कि लेनदेन कौन खोल रहा है और बंद कर रहा है - एप्लिकेशन डेवलपर या एप्लिकेशन सर्वर।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.