2010-10-13 11 views
12

से कनेक्शन वापस नहीं लौटा रहा है मेरे आवेदन में लंबे समय से चल रहे लेनदेन हैं और इसलिए मैंने प्रत्येक विधि के अंत में विकल्प सत्र.क्लोज़() विकल्प को आजमाया ताकि यह सुनिश्चित किया जा सके कि कनेक्शन ऑब्जेक्ट्स लंबे समय तक अनिश्चित काल तक नहीं हैं ।हाइबरनेट सत्र.क्लोस() पूल

जब session.close() विकल्प का उपयोग किया जाता है, तो मैं देख सकता हूं कि हाइबरनेट की सत्र वस्तु और session.connection() से प्राप्त संबंधित कनेक्शन ऑब्जेक्ट ठीक से नष्ट हो जाता है। लेकिन मुद्दा कनेक्शन पूल के साथ है। सत्र को प्राप्त करने के बाद भी सत्र द्वारा प्राप्त कनेक्शन कनेक्शन पूल पर वापस जारी नहीं किया जाता है। अन्य अनुरोध पूल से कनेक्शन के लिए इंतजार कर रहे हैं।

मैं अपने आवेदन में जेटीए लेनदेन का उपयोग कर रहा हूं। Hibernate.cfg.xml में, मैंने कनेक्शन (release_mode को ऑटो (डिफ़ॉल्ट) और कनेक्शन.autocommit को सत्य पर सेट किया है।

क्या किसी को भी इस समस्या का सामना करना पड़ा है? कृपया मुझे बताएं कि मैं यहां क्या खो रहा हूं।

का पालन-अप: यह मेरी हाइबरनेट विन्यास फाइल विवरण है:

<property name="connection.datasource">MXoraDS</property> 
<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property> 
<property name="connection.release_mode">after_statement</property> 
<property name="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.WeblogicTransactionManagerLookup</property> 
<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property> 
<property name="hibernate.current_session_context_class">org.hibernate.context.JTASessionContext</property> 
<property name="transaction.auto_close_session">true</property> 
<property name="max_fetch_depth">2</property> 

हम अनुप्रयोग परत ओरेकल DB से कनेक्ट होने पर JSF और EJB 2.1 का उपयोग करें। after_statement पूल से कनेक्शन जारी नहीं करता प्रतीत होता है। अगर आपको और जानकारी चाहिए तो कृपया मुझे बताएं।

+0

आप अपने विन्यास के बारे में अधिक जानकारी प्रदान करना चाहिए के बारे में अधिक विवरण जोड़ें। जैसे लेनदेन प्रबंधक और लेनदेन विन्यास, आप अपने लेनदेन का प्रबंधन कैसे करते हैं, आदि – Salandur

उत्तर

0

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

+0

आपकी प्रतिक्रिया के लिए हाय धन्यवाद। हम वेबलॉगिक लेनदेन प्रबंधक (org.hibernate.transaction। WeblogicTransactionManagerLookup) और JTATransactionFactory का उपयोग कर रहे हैं। लेनदेन को कंटेनर द्वारा प्रबंधित किया जाता है जो कनेक्शन ऑब्जेक्ट का ख्याल रखता है। सीएमटी का उपयोग करते समय, क्या यह संभव नहीं है कि हाइबरनेट सत्र बंद करके प्रोग्राम पूल से कनेक्शन को वापस कर दें? – Perfuser123

+0

उस मामले में, वेबलॉगिक लेनदेन से कनेक्शन जोड़ता है। जब लेनदेन समाप्त होता है, वेबलॉगिक पूल – Salandur

+0

कनेक्शन से कनेक्शन वापस कर देगा, लेन-देन के बाद या तो प्रतिबद्ध या रोलबैक के बाद पूल से कनेक्शन लौटाता है। लेकिन लेनदेन के अंदर मैंने बाहरी अनुप्रयोगों को कॉल किया है जो निष्पादित करने में लंबा समय लगता है। मैं कनेक्शन को बंद करने की कोशिश कर रहा हूं और लंबे समय तक चलने वाले तरीकों पर कॉल करने से पहले इसे पूल में वापस कर रहा हूं और फिर आवश्यक होने पर पुनः कनेक्ट कर रहा हूं। इस तरह मैं लंबे समय तक कनेक्शन नहीं रखूंगा। कृपया मुझे बताएं कि यह संभव है या नहीं। क्या मैं session.close का उपयोग कर पूल में कनेक्शन वापस कर सकता हूं या लंबे समय तक चलने वाले लेनदेन के अंदर डिस्कनेक्ट कर सकता हूं? – Perfuser123

19

मैं अपने आवेदन में जेटीए लेनदेन का उपयोग कर रहा हूं। Hibernate.cfg.xml में, मैंने कनेक्शन (release_mode को ऑटो (डिफ़ॉल्ट) और कनेक्शन.autocommit को सत्य पर सेट किया है।

क्या आप संपत्ति को after_statement पर स्पष्ट रूप से परिभाषित करने का प्रयास कर सकते हैं? मुझे पता है कि यह डिफ़ॉल्ट होना चाहिए, लेकिन आपके संदर्भ के आधार पर (क्या आप वसंत का उपयोग कर सकते हैं?), auto अपेक्षित व्यवहार नहीं कर सकता है (देखें hereऔरhere)।

निर्दिष्ट करता है कि हाइबरनेट चाहिए रिहाई JDBC कनेक्शन:

संदर्भ के लिए, क्या Table 3.4. Hibernate JDBC and Connection Properties संपत्ति hibernate.connection.release_mode के बारे में लिखते है। डिफ़ॉल्ट रूप से, एक जेडीबीसी कनेक्शन तब तक आयोजित किया जाता है जब तक सत्र स्पष्ट रूप से बंद या डिस्कनेक्ट हो जाता है। एक आवेदन के लिए सर्वर जेटीए डेटासोर्स, after_statement का उपयोग आक्रामक प्रत्येक जेडीबीसी कॉल के बाद रिलीज कनेक्शन के लिए करें। गैर-जेटीए कनेक्शन के लिए, लेनदेन को लेनदेन के अंत में after_transaction का उपयोग करके कनेक्शन को रिलीज़ करने के लिए अक्सर समझ में आता है। auto JDBC लेन-देन के लिए रणनीति JTA और CMT लेन-देन के लिए रणनीतियों after_statement और after_transaction का चयन करेंगे।

उदा।auto (डिफ़ॉल्ट) | on_close | after_transaction | after_statement

यह सेटिंग केवल प्रभावित सत्र SessionFactory.openSession से लौट आए। सत्र के लिए SessionFactory.getCurrentSession के माध्यम से प्राप्त, CurrentSessionContext कार्यान्वयन उपयोग के लिए कॉन्फ़िगर उन सत्र के लिए कनेक्शन रिलीज़ मोड नियंत्रित करता है। Section 2.5, “Contextual sessions”

देखें यदि यह मदद नहीं करता है, तो कृपया अपने पर्यावरण और विन्यास (वसंत?), तुम कैसे सत्र मिलता है, आदि

+0

को अधिक कनेक्शन जोड़ने यह मेरी हाइबरनेट विन्यास फाइल विवरण है: <संपत्ति नाम = "connection.datasource"> MXoraDS <संपत्ति नाम = "बोली"> org.hibernate.dialect.Oracle9Dialect <संपत्ति नाम = "connection.release_mode"> after_statement <संपत्ति नाम = "hibernate.transaction.manager_lookup_class"> org.hibernate.transaction.WeblogicTransactionManagerLookup <संपत्ति नाम = "hibernate.transaction.factory_class"> org.hibernate.transaction .JTATransactionFactory – Perfuser123

+0

अधिक जानकारी: <संपत्ति का नाम = "hibernate.current_session_context_class"> org.h ibernate.context.JTASessionContext <संपत्ति नाम = "transaction.auto_close_session"> सच <संपत्ति नाम = "max_fetch_depth"> 2 हम अनुप्रयोग परत ओरेकल DB से कनेक्ट होने पर JSF और EJB 2.1 का उपयोग करें। After_statement पूल से कनेक्शन जारी नहीं प्रतीत होता है। अगर आपको और जानकारी चाहिए तो कृपया मुझे बताएं। – Perfuser123

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