2012-01-04 16 views
15

वसंत के तहत एक हाइबरनेट सत्र का "जीवन चक्र" कितना सही ढंग से किया जाना चाहिए?वसंत + हाइबरनेट सत्र जीवन चक्र

SessionFactory स्प्रिंग द्वारा स्वचालित रूप से बनाया गया है और ग्लासफ़िश कनेक्शन पूल से अपने डीबी कनेक्शन ले रहा है। फिलहाल मुझे SessionFactory.getCurrentSession() के माध्यम से एक हाइबरनेट सत्र मिल रहा है। फिर मैं लेनदेन शुरू करता हूं, काम करता हूं और फिर commit() या rollback() अंत में। क्या मुझे disconnect(), close(), flush() या किसी अन्य समय किसी भी अन्य क्रियाएं करने की ज़रूरत है, तो कनेक्शन को पूल में वापस ठीक से वापस कर दिया जाएगा या वसंत द्वारा पहले से ही सब कुछ स्वचालित रूप से किया जा सकता है?

इन तरीकों के साथ यह समझने के लिए मेरे लिए थोड़ा उलझन में है कि क्या किया जाना चाहिए, शायद कोई सही दिशा को इंगित कर सकता है?

उत्तर

12

चूंकि स्प्रिंग द्वारा सत्र फ़ैक्टरी स्वचालित रूप से बनाई जाती है, वसंत ढांचे कनेक्शन को बंद करने का ख्याल रखेगी। Spring Resource Management

यदि आप जांचना चाहते हैं तो देखें। यदि आप अपने ऐप के लिए लॉगिंग का उपयोग कर रहे हैं, तो आप लॉग की जांच कर सकते हैं। यह हो जाएगा की तरह:

(मुख्य) जानकारी [AnnotationSessionFactoryBean] समापन हाइबरनेट SessionFactory

मैं से this link

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

+0

सत्र फ़ैक्टरी मेरे सिस्टम पर सिंगलटन बीन के रूप में कॉन्फ़िगर किया गया है, इसलिए यह कभी बंद नहीं होगा ... – Laimoncijus

+0

@Laimoncijus: सत्र फ़ैक्टरी डिफ़ॉल्ट सिंगलटन द्वारा है। जवाब तदनुसार संशोधित किया गया। इसे जांचें –

+0

तो, आपको sessionfactory सिंगलटन को कॉन्फ़िगर करने की आवश्यकता नहीं है। यह उत्तर भी देखें: http://stackoverflow.com/questions/8523332/close-opened-hibernation-sessions-if-exist/8530891#8530891 –

2

आशा this लिंक आपको सत्र और लेनदेन के बारे में मार्गदर्शन करेगा।

फिर मैं लेनदेन शुरू करता हूं, काम करता हूं और फिर अंत में() या रोलबैक() प्रतिबद्ध करता हूं। क्या मुझे डिस्कनेक्ट(), क्लोज़(), फ्लश() या किसी अन्य समय पर किसी भी अन्य क्रियाएं करने की ज़रूरत है, तो कनेक्शन सही ढंग से पूल पर वापस लौटेगा या सब कुछ पहले से ही वसंत द्वारा किया गया है?

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

3

जब आप सत्र Factory.getCurrentSession() के माध्यम से हाइबरनेट क्वेरी निष्पादित कर रहे हैं, तो वसंत कनेक्शन खोलने और बंद करने का आवश्यक कार्य करता है। वसंत कॉन्फ़िगरेशन में आप जिस सत्र फ़ैक्टरी का उपयोग कर रहे हैं वह भी config.buildSessionFactory विधि को आंतरिक रूप से कॉल करता है।

इनमें से अधिकांश सार सत्र FactoryBean के कार्यान्वयन में होता है। कथन सेटिंग्स का उपयोग कर सत्र FactoryImpl कक्षा में कनेक्टिंग का समापन किया जाता है .getConnectionProvider()। बंद(); । संक्षेप में, हाइबरनेट आपके लिए सबकुछ करता है।वसंत बस जरूरी होने पर इसकी मदद करता है।

6

के बारे में कैसे वापस कनेक्शन पूल के लिए कनेक्शन रिलीज वसंत यह कोई लेना देना नहीं है नीतियों विन्यास पैरामीटर hibernate.connection.release_mode, जिसमें से org.hibernate.ConnectionReleaseMode

प्रारंभ में enum द्वारा पहचाना जाता है के माध्यम से हाइबरनेट अपने आप में कॉन्फ़िगर किया गया है संस्करण 3.1+, hibernate.connection.release_mode का डिफ़ॉल्ट मान auto है जो संबंधित ConnectionReleaseMode मान इस बात पर निर्भर करता है कि जेटीए या जेडीबीसी लेनदेन का उपयोग किया जाता है या नहीं। जेडीबीसी लेनदेन के मामले में, यह ConnectionReleaseMode.AFTER_TRANSACTION (i.e after_transaction) पर सेट है।

ConnectionReleaseMode.AFTER_TRANSACTION के व्यवहार है जो: कनेक्शन, प्रत्येक लेन-देन के बाद कनेक्शन पूल को लौटा दी जाएगी कि या तो transaction.commit() या transaction.rollback() बुला, साथ ही session.close() और session.disconnect() बुला

आप में इस व्यवहार को सत्यापित कर सकते हैं कर रहा है hibernate documentation Section 11.5

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