2014-05-23 11 views
5

मैं एक जेपीए एप्लिकेशन (हाइबरनेट के साथ) विकसित कर रहा हूं, और मैं ऑटोफ्लश सुविधा के साथ लड़ रहा हूं।किसी दिए गए डेटा का चयन करते समय EntityManager की फ्लश को रोकें

डिफ़ॉल्ट रूप से, जब भी हम किसी भी इकाई पर कोई क्वेरी संसाधित करते हैं, तो पूर्ण EntityManager फ़्लश किया जाता है। ज्यादातर मामलों में यह ठीक है: हम चाहते हैं कि जेपीए अद्यतित डीबी के खिलाफ प्रश्नों को संसाधित करे।

हालांकि, ऐसा होता है कि हम कुछ डी 0 में कार्यात्मक पैरामीटर स्टोर भी करते हैं। यह पूरी तरह से हमारे मूल व्यापार मॉडल से अलग है, और हम नहीं चाहते हैं कि हम पैरामीटर का चयन करते हुए हमने ईएम को फ़्लश किया: पैरामीटर प्राप्त करना प्रक्रिया में काफी गहरा हो सकता है और जब हम इसे जानते हैं तो हम ईएम को फ़्लश करने का नियंत्रण खो देते हैं; ठीक है ।

दरअसल, यह कुछ डीबी बाधा अपवाद का कारण बनता है: डेटा मॉडल अभी तक (प्रक्रिया के बीच में) स्थिर नहीं है, और पैरामीटर का चयन इस डेटा मॉडल की फ्लश को मजबूर करता है।

मैं पैरामीटर के दूसरे इकाई प्रबंधक जोड़ने पर विचार कर रहा हूं, लेकिन मुझे थोड़ा अधिक लगता है।

क्या इसे और आसानी से हल किया जा सकता है? पैरामीटर डीएओ पर अलगाव स्तर के साथ, ताकि पैरामीटर्स को एक अलग लेनदेन में संसाधित किया जा सके?

उत्तर

1

मैं आप JTA का उपयोग करते हैं:

  1. ParametersDAO में एक नई लेन-देन का उपयोग करें। इस तरह बाहरी सेवा में आपकी प्रबंधित इकाइयों को सहज डीएओ (आईएमएचओ!) में प्रबंधित नहीं किया जाएगा। नुकसान यह है कि जब आपका ParametersDAO रिटर्न देता है, लेनदेन प्रतिबद्ध होगा (यदि वह वांछित नहीं है, तो आप एक स्टेटफुल ईजेबी का उपयोग कर सकते हैं, लेकिन यह मेरे लिए एक ओवरकिल जैसा लगता है)।
  2. अन्यथा, एक दूसरा EntityManager होने पर मुझे इतना अधिक प्रतीत नहीं होता है।

द्वितीय। आप संसाधन स्थानीय उपयोग करते हैं:

आप एक आवेदन-प्रबंधित वातावरण (transaction-type="RESOURCE_LOCAL") में हैं, तो बस (एक दूसरे EntityManager होने के साथ इसी तरह) से EntityManagerFactory एक और EntityManager मिलता है।

3

इसे जेटीए लेनदेन के साथ हल किया जा सकता है, लेकिन आपको जेटीए लेनदेन प्रबंधक की आवश्यकता है। यदि आप पहले से ही जेटीए समर्थन के मुकाबले जावा ईई एप्लीकेशन सर्वर में चल रहे हैं। यदि आप स्प्रिंग आधारित एप्लिकेशन चलाते हैं तो आपको स्टैंड-अलोन टीएम शामिल करना होगा, जैसे Bitronix

जेटीए आपको एक ही वैश्विक लेनदेन में एक ही डीबी (लेकिन एक ही धागे से कई डेटा स्रोतों के साथ) के लिए भी कई कनेक्शनों को शामिल करने की अनुमति देता है। तो आप इकाई प्रबंधक एक कनेक्शन को सूचीबद्ध करेंगे और फिर आप अपने एक्सए कनेक्शन पूल से एक नया कनेक्शन खोल सकते हैं (आपके जेटीए लेनदेन प्रबंधक द्वारा प्रदान किया गया है, जैसे बिट्रोनिक्स) और कार्यात्मक पैरामीटर सहेजें।

उन 2 सूचीबद्ध समूहों को अलग किया जाएगा, इसलिए लेनदेन के बाद तक एक में परिवर्तन दूसरे में उपलब्ध नहीं होगा।

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

+0

मैं सचमुच curios हूं कि आप "अपने एक्सए कनेक्शन पूल से नया कनेक्शन कैसे खोल सकते हैं", क्या आप कृपया उस पर अधिक जानकारी दे सकते हैं? पीएस: यह एक दिलचस्प समाधान हो सकता है, लेकिन मानक एपीआई का उपयोग नहीं कर रहा है। –

+0

मेरी [HibernateSQLStatementCountTest] की जांच करें (https://github.com/vladmihalcea/vladmihalcea.wordpress.com/blob/master/hibernate-facts/src/test/java/com/vladmihalcea/HibernateSQLStatementCountTest.java)। यह 2 डेटा स्रोतों को सूचीबद्ध करता है: एक ही डीबी के लिए उसी लेनदेन में testDataSource और अन्य डेटा स्रोत, प्रत्येक व्यक्ति के अपने कनेक्शन के साथ। डीबग [मुख्य]: bttPreparer - संसाधन तैयार करने uniqueName = otherDataSource डीबग [मुख्य] ​​के साथ एक XAResourceHolderState: bttPreparer - uniqueName = testDataSource –

+0

के साथ एक XAResourceHolderState यही कारण है कि आप अपने जवाब में वर्णित नहीं है की तैयारी संसाधन: GitHub पर आपके पास दो अलग-अलग ' डेटासोर्स और आपके उत्तर में आप एक ही 'डेटासोर्स' के लिए दो कनेक्शन पुनर्प्राप्त करने के बारे में बात कर रहे हैं। –

संबंधित मुद्दे