2008-10-21 7 views
61

मैंने अभी अपने होमग्राउन दृढ़ता ढांचे को जेपीए में माइग्रेट करना शुरू कर दिया है।क्या मुझे प्रत्येक EntityManager को बंद करना है?

यह देखते हुए कि दृढ़ता ढांचे में बहुत सारी नलसाजी छिपी हुई है, मुझे यह जानने में दिलचस्पी है कि क्या EntageManagers बंद नहीं होगा संसाधन संसाधन रिसाव बनाएंगे, या यदि ढांचे मेरे लिए एकत्र और बंद कर देंगे।

मैं उन सभी स्थानों को बंद करने का इरादा रखता हूं, लेकिन क्या मुझे करना है?

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

+1

यह भी देखें [क्या जेपीए इकाई प्रबंधक बंद होना चाहिए?] (Http://stackoverflow.com/q/10762974/697630) –

उत्तर

71

यह निर्भर करता है कि आपने इसे कैसे प्राप्त किया।

यदि आपने इसे EntityManagerFactory का उपयोग करके बनाया है तो आपको इसे बंद करना होगा चाहे आप किस फ्रेमवर्क का उपयोग करें।

यदि आप निर्भरता इंजेक्शन (उदाहरण के लिए ईजेबी और @ पर्सिस्टेंस कॉन्टेक्स्ट एनोटेशन का उपयोग करके) प्राप्त करते हैं तो आपको इसे हाथ से बंद नहीं करना चाहिए (AFAIK यह RuntimeException का कारण बन जाएगा)।

+5

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

10

आपको करना चाहिए।

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

विचार "हमेशा बंद java.sql.Connection" जैसा ही है (कुछ डेटा स्रोतों के बावजूद निष्क्रियता से स्वचालित रूप से उन्हें बंद करने के लिए सेटिंग्स हैं) या "हमेशा हाइबरनेट सत्र बंद करें"।

इसके अलावा, यदि आप पोर्टेबल कोड लिखने की योजना बना रहे हैं, तो आपको विशिष्ट जेपीए प्रदाता "स्मार्ट होने" पर भरोसा नहीं करना चाहिए - अन्य समय पर ईएम को बंद करने में विफल हो सकता है।

2

मैंने EntityManager को @PersistenceContext एनोटेशन का उपयोग करके मेरे भंडार में प्राप्त किया है। मैं देख सकता हूं कि कनेक्शनपूल के बाद maxPoolSize तक पहुंच जाता है, यह साफ़ नहीं होता है।

हालांकि अगर मैं EntityManagerEntityManagerFactory का उपयोग करके entitymanager.close() पर कॉल करता हूं तो कनेक्शन साफ़ हो रहे हैं। मैं c3p0 का उपयोग कनेक्शनपूल लाइब्रेरी के रूप में कर रहा हूं।

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