2011-11-08 17 views
110

मेरे पास जेएसपी वेब एप्लिकेशन में हाइबरनेट का उपयोग करने के बारे में कुछ प्रश्न हैं।हाइबरनेट ओपन सत्र() बनाम getCurrentSession()

  1. क्या hibernate.current_session_context_class के लिए मूल्य क्या होना चाहिए?

  2. फिर, निम्नलिखित में से कौन से कथन का उपयोग किया जाना चाहिए? और क्यों?

    Session s = HibernateUtil.getSessionFactory().openSession(); 
    Session s = HibernateUtil.getSessionFactory().getCurrentSession() 
    
  3. अन्त में, जो एक बेहतर "वेब प्रति ऐप एक सत्र" या "अनुरोध के अनुसार एक सत्र" क्या है?

उत्तर

122

जैसा कि इस मंच में बताया गया है post, 1 और 2 संबंधित हैं। यदि आप hibernate.current_session_context_class को थ्रेड पर सेट करते हैं और फिर सत्र खोलने वाले सर्वलेट फ़िल्टर की तरह कुछ लागू करते हैं - तो आप SessionFactory.getCurrentSession() का उपयोग करके कहीं भी उस सत्र तक पहुंच सकते हैं।

SessionFactory.openSession() हमेशा एक नया सत्र खोलता है जिसे आप ऑपरेशन के साथ पूरा करने के बाद बंद करना चाहते हैं। SessionFactory.getCurrentSession() एक संदर्भ के लिए एक सत्र बंधे देता है - आपको इसे बंद करने की आवश्यकता नहीं है।

यदि आप लेनदेन प्रबंधित करने के लिए स्प्रिंग या ईजेबी का उपयोग कर रहे हैं तो आप लेनदेन के साथ सत्र खोलने/बंद करने के लिए उन्हें कॉन्फ़िगर कर सकते हैं।

आपको कभी भी one session per web app का उपयोग नहीं करना चाहिए - सत्र एक थ्रेड सुरक्षित ऑब्जेक्ट नहीं है - एकाधिक थ्रेड द्वारा साझा नहीं किया जा सकता है। "डेटाबेस प्रति आवेदन प्रति SessionFactory" ( जैसे, अगर आप का उपयोग 3 डेटाबेस भी है हमारे आवेदन में, आप बनाने की जरूरत: आप हमेशा "अनुरोध के अनुसार एक सत्र" या "प्रति लेन-देन एक सत्र"

+0

आपको बहुत धन्यवाद, @gkamal। मैं [ओपन सत्र में दृश्य] में कोड देखता हूं (http://community.jboss.org/wiki/OpenSessionInView) दस्तावेज़। (आपका लिंक उस दस्तावेज़ को इंगित करता है।) लेखक फ़िल्टर के उपयोग का सुझाव देता है। अपने फ़िल्टर कोड में, वह 'ओपन सत्र() 'या' क्लोज़()' नहीं कहता है। वह केवल 'getCurrentSession() 'कहता है। मुझे लगता है कि वह 'current_session_context' को' थ्रेड 'पर सेट करता है। अब मुझे लगता है कि मैं समझता हूं 'getCurrentSession() '। हालांकि, मुझे नहीं पता कि मुझे 'openSession() 'का उपयोग कब करना चाहिए। – wannik

+4

यदि आप सत्र को किसी भी संदर्भ से बाध्य नहीं करना चाहते हैं तो आप OpenSession का उपयोग करेंगे। ऐसी कुछ स्थितियां हैं जब आपको एक अलग सत्र की आवश्यकता होगी - संदर्भ के लिए एक से अधिक बाध्य (हाइबरनेट इंटरसेप्टरों की एक सीमा है कि आप मूल सत्र का उपयोग नहीं कर सकते हैं) - उन मामलों में आप वर्तमान सत्र के बजाय ओपनसेशन का उपयोग करेंगे। ओपनसेशन एक नया सत्र बनाता है जिसे आपको स्पष्ट रूप से बंद करना होगा। उदाहरण के लिए, एक डीएओ विधि में आप ओपनसेशन को कॉल करेंगे - सत्र का उपयोग करें और इसे बंद करें। GetCurrentSession() का उपयोग कर – gkamal

+0

बजे; क्योंकि मैंने इसे श्रोता में शुरू किया है फ़िल्टर नहीं है यह आपके विचार से ठीक है; मैं mvc2 jsp servlet – shareef

-4

SessionFactory का उपयोग करना चाहिए सत्र प्रत्येक डीबी प्रति फैक्ट्री ऑब्जेक्ट, पूरी तरह से आपको 3 सत्र फैक्ट्री बनाने की आवश्यकता होती है। अन्यथा यदि आपके पास केवल एक डेटाबेस है, तो सत्रफ्रैक्टरी पर्याप्त है)।

सत्र: "एक अनुरोध-प्रतिक्रिया चक्र के लिए एक सत्र"। अनुरोध मिलने पर आप सत्र खोल सकते हैं और आप अनुरोध प्रक्रिया पूरी होने के बाद सत्र बंद कर सकते हैं। नोट: - वेब एप्लिकेशन के लिए एक सत्र का उपयोग न करें।

13

अगर हम()

  • SessionFactory.openSession के बारे में बात यह हमेशा नए सत्र वस्तु बनाने के।
  • आपको सत्र वस्तुओं को स्पष्ट रूप से फ़्लश और बंद करने की आवश्यकता है।
  • सिंगल थ्रेडेड वातावरण में यह getCurrentSession से धीमा है।
  • आपको इस विधि को कॉल करने के लिए किसी भी संपत्ति को कॉन्फ़िगर करने की आवश्यकता नहीं है।

और हम SessionFactory.getCurrentSession के बारे में() बात तो

  • यह मौजूद है यदि नहीं, किसी और एक ही सत्र जो वर्तमान हाइबरनेट संदर्भ में है का उपयोग एक नया सत्र बनाता है।
  • आपको सत्र वस्तुओं को फ्लश और बंद करने की आवश्यकता नहीं है, इसे स्वचालित रूप से आंतरिक रूप से हाइबरनेट द्वारा देखभाल की जाएगी।
  • सिंगल थ्रेडेड वातावरण में यह ओपन सत्र से तेज़ है।
  • आपको अतिरिक्त संपत्ति को कॉन्फ़िगर करने की आवश्यकता है। GetCurrentSession विधि को कॉल करने के लिए "hibernate.current_session_context_class", अन्यथा यह एक अपवाद फेंक देगा।
0
openSession :- When you call SessionFactory.openSession, it always create new Session object afresh and give it to you. 

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

getCurrentSession :- When you call SessionFactory. getCurrentSession, it will provide you session object which is in hibernate context and managed by hibernate internally. It is bound to transaction scope. 
When you call SessionFactory. getCurrentSession , it creates a new Session if not exists , else use same session which is in current hibernate context. It automatically flush and close session when transaction ends, so you do not need to do externally. 
If you are using hibernate in single threaded environment , you can use getCurrentSession, as it is faster in performance as compare to creating new session each time. 
You need to add following property to hibernate.cfg.xml to use getCurrentSession method. 



<session-factory> 
<!-- Put other elements here --> 
<property name="hibernate.current_session_context_class"> 
      thread 
</property> 
</session-factory> 
संबंधित मुद्दे