क्या जेपीए इकाई प्रबंधक बंद होना चाहिए?


83

मेरे पास तरीका नीचे है।

public Profile readUser(String email){
    EntityManager em = EMF.get().createEntityManager();
    return em.find(Profile.class, email);
}

क्या इकाई प्रबंधक का उपरोक्त उपयोग ठीक है? या उन्हें बंद करना आवश्यक है? कोई सुझाव कृपया।



नहीं, बस नहीं। जब तक आप लीक नहीं चाहते ...

जवाबों:


131

मुझे लगता है कि उत्तर है: यह निर्भर करता है

आपका इकाई प्रबंधक उस संदर्भ तक पहुंच प्राप्त करने की कुंजी है जहां संस्थाएं निवास करती हैं। यदि आपका आवेदन एक JSE आवेदन है, तो आपको विचार करना होगा कि आपके संदर्भ की जीवन प्रत्याशा क्या है।

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

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

निचला रेखा, जब आप इसे खोलते हैं और जब आप बंद करते हैं तो यह पूरी तरह से आपकी रणनीति और आपके डिजाइन पर निर्भर करता है। आप इसे तब बंद करते हैं जब आपको इसके संदर्भ में संस्थाओं की आवश्यकता नहीं होती है।

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

यदि आप इसे बंद नहीं करते हैं तो आपके द्वारा इनका उपयोग किए जाने के बाद भी आपकी इकाइयां संलग्न रखी जाएंगी। आपके संदर्भ को तब भी जीवित रखा जाएगा जब आप अपने ईएम तक नहीं पहुंच सकते।

जेपीए विशिष्टता अधिक विवरण होता है। धारा 7.7 आवेदन-प्रबंधित दृढ़ता संदर्भों में यह कहता है:

जब अनुप्रयोग-प्रबंधित निकाय प्रबंधक का उपयोग किया जाता है, तो अनुप्रयोग सीधे इकाई प्रदाता जीवनचक्र का प्रबंधन करने और दृढ़ता संदर्भों को प्राप्त करने और नष्ट करने के लिए दृढ़ता प्रदाता की इकाई प्रबंधक कारखाने के साथ सीधे संपर्क करता है।

ऐसे सभी एप्लिकेशन-प्रबंधित दृढ़ता संदर्भों को दायरे में विस्तारित किया जाता है, और कई लेन-देन कर सकते हैं।

EntityManagerFactory.createEntityManagerविधि और EntityManager closeऔर isOpenतरीकों के लिए एक आवेदन से प्रबंधित इकाई प्रबंधक के जीवन चक्र और इससे संबंधित हठ संदर्भ प्रबंधन करने के लिए उपयोग किया जाता है।

विस्तारित दृढ़ता का संदर्भ उस बिंदु से मौजूद है, जिस पर इकाई प्रबंधक के उपयोग EntityManagerFactory.createEntityManagerसे इकाई प्रबंधक के बंद होने तक उपयोग किया जाता है EntityManager.close

अनुप्रयोग-प्रबंधित निकाय प्रबंधक से प्राप्त एक विस्तारित दृढ़ता संदर्भ एक स्टैंड-अलोन दृढ़ता संदर्भ है जिसे लेनदेन के साथ प्रचारित नहीं किया जाता है।

[...] EntityManager.closeविधि अपनी दृढ़ता और अन्य संसाधनों को जारी करने के लिए एक इकाई प्रबंधक को बंद कर देती है। पास बुलाने के बाद, एप्लिकेशन को EntityManagerउदाहरण के अलावा किसी भी आगे के तरीके को लागू नहीं करना चाहिए getTransactionऔर isOpen, या IllegalStateExceptionफेंक दिया जाएगा। यदि लेन-देन सक्रिय होने पर करीबी तरीका लागू किया जाता है, तो लेनदेन पूरा होने तक दृढ़ता का संदर्भ प्रबंधित रहता है।

EntityManager.isOpenविधि इंगित करता है कि इकाई प्रबंधक खुला है। isOpenजब तक इकाई प्रबंधक बंद नहीं किया जाता है, तब तक यह विधि सही साबित होती है। वास्तव में यह समझने के लिए कि यह कैसे काम करता है यह इकाई प्रबंधक और संदर्भ के बीच के रिश्ते को समझना महत्वपूर्ण है।

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

दृढ़ता संदर्भ विभिन्न प्रकार के हो सकते हैं। जावा ईई अनुप्रयोगों में, आप या तो लेन-देन-स्कॉप्ड दृढ़ता संदर्भ या विस्तारित-दृढ़ता संदर्भ रख सकते हैं । जेएसई एप्लिकेशन में, संदर्भ की प्रकृति डेवलपर द्वारा नियंत्रित की जाती है

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

लेन-देन-दायरे वाले

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

@PersistenceContext(unitName="EmplService")
EntityManager em;

इसका मतलब यह भी है कि आप अपने लेनदेन को कैसे डिज़ाइन करते हैं, इसके आधार पर, आप एक से अधिक संदर्भों के साथ समाप्त हो सकते हैं।

विस्तारित-दृढ़ता का संदर्भ

स्टेटफुल सेशन बीन्स के साथ जावा ईई एप्लीकेशन में आप कई बीन इनवोकेशन से बचे रहने के संदर्भ को पसंद कर सकते हैं, क्योंकि जब तक बीन को हटाने के लिए चिह्नित नहीं किया गया है, तब तक आप इसे पसंद नहीं करते हैं? उन मामलों में, आपको एक विस्तारित दृढ़ता संदर्भ का उपयोग करने की आवश्यकता है। इस मामले में, दृढ़ता का संदर्भ तब बनता है जब यह पहली बार आवश्यक होता है, लेकिन यह तब तक अमान्य नहीं होगा जब तक कि आपके निशान हटाने के लिए स्टेटफुल बीन नहीं होगा।

@PersistenceContext(unitName="EmplService", type=PersistenceContextType.EXTENDED)

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

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

आवेदन से प्रबंधित

आप हमेशा अपने इकाई प्रबंधक कारखाने और अपने इकाई प्रबंधक को मैन्युअल रूप से त्वरित कर सकते हैं। यह वही है जो आप आमतौर पर एक जेएसई एप्लिकेशन में करते हैं, क्या यह सही है?

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

इस तरह के आवेदन के लिए, जब आप अपने इकाई प्रबंधक को तत्काल भेजते हैं, तो एक संदर्भ स्वतः ही इससे जुड़ जाता है।

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

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


शानदार उत्तर, लेकिन मुझे यह जानने की जरूरत है: एक सत्र के दौरान एंटिटी मैनजर को कई बार खोलना और बंद करना एक प्रदर्शन लागत है? तुरंत एक बार बंद और बंद करें, या हर डेटाबेस क्रूड ऑपरेशन में इसे तत्काल / बंद / उपयोग करें, जो सबसे अच्छा तरीका है? "यह निर्भर करता है" ठीक है, लेकिन उपयोग के मामलों के बहुमत के लिए अधिक उपयुक्त उपयोग होना चाहिए ..
tomrlh

4
@tomurlh जहाँ तक मेरा सवाल है मुझे बनाने की लागत EntityManagerनगण्य होनी चाहिए। मेरे दृष्टिकोण से EntityManager वर्तमान लेनदेन के काम की इकाई से निपटने के लिए सिर्फ एक अमूर्त है । मेरा मानना ​​है कि प्रति लेनदेन एक बनाने और नष्ट करने के लिए यह पूरी तरह से ठीक है। अब, इसके अन्य निहितार्थ हैं, क्योंकि EntityManagerसर्वर आपकी संस्थाओं के लिए एक लेन-देन कैश के रूप में है और इसलिए एक अच्छी तरह से परिभाषित लेनदेन गुंजाइश है और संस्थाओं के साथ ठीक से काम करना इस कैश का लाभ उठा सकता है।
एडविन डेलोरजो

EntityManager.close पद्धति अपनी दृढ़ता के संदर्भ को जारी करने के लिए एक इकाई प्रबंधक को बंद कर देती है जो एक दृढ़ता संदर्भ है?
१२:

इसका मतलब यह भी है कि आप अपने लेनदेन को कैसे डिज़ाइन करते हैं, इसके आधार पर, आप एक से अधिक संदर्भों के साथ समाप्त हो सकते हैं। क्या आप बता सकते हैं कि कैसे?
१२:१
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.