mysql - What is the proper way to ensure EntityManager connections are closed? -


हमारे डीएओ परत में 1 9 तरीके हैं, प्रत्येक यह कुछ भिन्नता है:

  सार्वजनिक TicketProp saveTicketProp (TicketProp प्रोप) {EntityManager em = this.emf.createEntityManager (); कोशिश {em.getTransaction ()। शुरू (); प्रोप = (टिकेटप्रॉप) em.merge (prop); em.getTransaction () के लिए प्रतिबद्ध ()।; वापसी सहारा; } अंत में {em.close (); }}  

अर्थ: प्रत्येक पद्धति में हम अपने लेनदेन को संभालते हैं और अंत में ब्लॉक में इसे बंद करते हैं। हम एक जर्सी ऐप का परीक्षण कर रहे हैं, इसलिए हमारे जेयूनिट परीक्षण जर्सीटीस्ट को बढ़ाते हैं प्रत्येक परीक्षा पद्धति ग्रिज़ली कंटेनर को तत्काल प्रदान करती है, परीक्षण चलाती है, फिर कंटेनर को बंद कर देती है EntityManagerFactory वसंत द्वारा अंतःक्षिप्त है। हम हाइबरनेट पर जेपीए का उपयोग कर रहे हैं।

मैं अपने MySQL टेस्ट डीबी से कनेक्शन की निगरानी कर रहा हूं और वे हमेशा उच्च होते हैं अकेले एक परीक्षण MySQL "Max_used_connections" चर को 38 पर चलाता है। मज़े के लिए, मैं गया और सभी em.close () कॉलों पर टिप्पणी की, और परीक्षण अभी भी 38 कनेक्शन का उपयोग करता है।

मैं हाइबरनेट का उपयोग कर रहा हूं अंतर्निहित कनेक्शन पूलिंग (उपयोग के लिए नहीं, मुझे पता है)। मुझे अभी भी कुछ प्रकार की बुद्धिमान पूलिंग की उम्मीद है।

क्या मैं इकाई प्रबंधक को गलत तरीके से संभाल रहा हूं? मैं और कैसे कनेक्शन बंद कर सकता हूं?

आपको बंद the EntityManagerFactory अपने परीक्षण के अंत में के जवादाक से:

  शून्य javax.preistence.EntityManagerFactory.close ()  

कारखाने को बंद करें, किसी भी संसाधनों को जारी करने के लिए जो इसे रखता है। एक कारखाने के उदाहरण को बंद करने के बाद, उस पर लागू सभी विधियों IllegalStateException को छोड़कर, isOpen को छोड़ दें, जो झूठी वापसी करेगा। एक बार EntityManagerFactory बंद कर दिया गया है, उसके सभी इकाई प्रबंधक को बंद स्थिति में माना जाता है।

एक तरफ नोट के रूप में, आपको वास्तव में इससे पहले लेन-देन करना चाहिए अंत में खंड में ईएम को बंद करना:

  सार्वजनिक टिकटप्रॉप सेव टिकेटप्राप (टिकेटप्रॉप प्रोप) {EntityManager em = this.emf.createEntityManager (); कोशिश {em.getTransaction ()। शुरू (); प्रोप = (टिकेटप्रॉप) em.merge (prop); em.getTransaction () के लिए प्रतिबद्ध ()।; वापसी सहारा; } अंत में {यदि (em.getTransaction ()। IsActive ()) {em.getTransaction ()। रोलबैक (); } अगर (em.isOpen ()) {em.close (); }}}  
पर क्लिक करें

Comments

Popular posts from this blog

c# - sqlDecimal to decimal clr stored procedure Unable to cast object of type 'System.Data.SqlTypes.SqlDecimal' to type 'System.IConvertible' -

Calling GetGUIThreadInfo from Outlook VBA -

Obfuscating Python code? -