2010-08-03 9 views
14

मैं सीख रहा हूँ JPA और उदाहरण में सामान्य पद्धति इस प्रकार हो रहा है: के रूप में यह खुला रखने और सिर्फ नए लेनदेन शुरू करने के लिए विरोधजेपीए EntityManager को खोलना खुला है?

EntityManager em = factory.createEntityManager(); 
em.getTransaction().begin(); 
// .... 
em.getTransaction().commit(); 
em.close(); 

अब मैं क्यों हम लगातार करीब EntityManagers बना सकते हैं और करते सोच रहा हूँ,? खुले बनाम इसे हर समय बंद रखने के लाभ और लागत क्या हैं?

उत्तर

7

दो जेपीए-विशिष्ट कारणों दिमाग में आते हैं:

  1. EntityManager जेपीए कल्पना द्वारा threadsafe किए जाने की गारंटी नहीं है। इसलिए, पोर्टेबल जेपीए ऐप्स एक समय में केवल एक थ्रेड में ईएम का उपयोग कर सकते हैं। एक विधि-स्थानीय ईएम बनाने और इसे दायरे से बाहर होने से पहले इसे बंद करने का मुहावरा ईएम संदर्भों के ढेर को सीमित करने के लिए प्रोत्साहित करता है।

  2. "विस्तारित" दृढ़ता संदर्भ लाइफटाइम का उपयोग कर एक ईएम अपने पूरे अस्तित्व के लिए एक दृढ़ता संदर्भ बनाए रखता है। इसका मतलब है कि संस्थाएं commit() पर स्वचालित रूप से अलग हो जाती हैं। इसके बजाय उन्हें मैन्युअल रूप से अलग किया जाना चाहिए, अन्यथा ईएम उन्हें ट्रैक करने के लिए ज़िम्मेदार है।

यह सवाल वास्तव में पुरानी "ऑब्जेक्ट्स पूल करने के लिए" प्रश्न का एक जेपीए-विशिष्ट संस्करण है। यह एक कठिन है, लेकिन जवाब शायद "शायद ही कभी" है।

जावा समवर्ती विशेषज्ञ ब्रायन गोएट्ज द्वारा यह old developerWorks post बिंदु का विस्तार करता है। ग्रिस्ट: पूल कनेक्शन की तरह महंगा वस्तुओं के लिए पूल बहुत अच्छी समझ में आता है। लेकिन अल्पकालिक, छोटी, और त्वरित प्रारंभिक वस्तुओं जैसे EntityManager, पूलिंग या दीर्घकालिक संदर्भ प्रतिधारण के किसी अन्य रूप के लिए एक कठिन बिक्री है।

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

5

एक इकाई प्रबंधक को खोलना इसे कनेक्शन पूल से इसके कनेक्शन को वापस करने से रोकता है।

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

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

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