सीतनिद्रा में होना OpenSession () बनाम getCurrentSession ()


130

JSP वेब एप्लिकेशन में हाइबरनेट का उपयोग करने के बारे में मेरे कुछ प्रश्न हैं।

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

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

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

जवाबों:


145

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

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

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

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


बहुत बहुत धन्यवाद, @gkamal। मैं खुले सत्र में कोड को दस्तावेज़ में देखता हूं । (आपका लिंक उस दस्तावेज़ को इंगित करता है।) लेखक फ़िल्टर के उपयोग का सुझाव देता है। अपने फ़िल्टर कोड में, वह कॉल openSession()या नहीं करता है close()। वह केवल फोन करता है getCurrentSession()। मुझे लगता है वह current_session_contextकरने के लिए सेट करता है thread। अब मुझे लगता है कि मैं समझता हूं getCurrentSession()। हालाँकि, मुझे नहीं पता कि मुझे कब उपयोग करना चाहिए openSession()
वणिक

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

getCurrentSession () का उपयोग कर रहा हूं; क्योंकि मैंने इसे श्रोता में आरंभीकृत किया है फ़िल्टर नहीं यह आपके विचार से ठीक है;
mvc2

@gkamal - मेरे पास इससे संबंधित एक प्रश्न है Sessions। क्या आप कृपया इसमें मेरी मदद कर सकते हैं - stackoverflow.com/questions/23351083/… । धन्यवाद और चेंकी।
एरन मोराद

IMO, प्रत्येक सूत्र को अपना सत्र रखने देना अच्छा अभ्यास है, और केवल एक सत्र, सही?
कोडरज़

31

अगर हम SessionFactory.openSession () के बारे में बात करते हैं

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

और अगर हम SessionFactory.getCurrentSession () के बारे में बात करते हैं

  • यह एक नया सत्र बनाता है यदि मौजूद नहीं है, तो उसी सत्र का उपयोग करता है जो वर्तमान हाइबरनेट संदर्भ में है।
  • आपको सत्र ऑब्जेक्ट को फ्लश करने और बंद करने की आवश्यकता नहीं है, यह आंतरिक रूप से हाइबरनेट द्वारा स्वचालित रूप से ध्यान रखा जाएगा।
  • एकल थ्रेडेड वातावरण में यह ओपनसेशन () से तेज है।
  • आपको अतिरिक्त संपत्ति को कॉन्फ़िगर करने की आवश्यकता है। getCurrentSession () विधि को कॉल करने के लिए "hibernate.current_session_context_class", अन्यथा यह एक अपवाद फेंक देगा।

ऊपर दिया गया उत्तर वेबएप पर एक सत्र का उपयोग नहीं करने के लिए कहता है। इस प्रकार यदि मैं उपयोग कर रहा था getCurrentSession, तो यह एक ही स्थान का पुन: उपयोग करेगा, है ना?
पारसकर

9

openSession: जब आप फोन करते हैं SessionFactory.openSession, तो यह हमेशा एक नई Sessionवस्तु बनाता है और आपको देता है।

आपको इन सत्र वस्तुओं को स्पष्ट रूप से फ्लश और बंद करने की आवश्यकता है।

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

getCurrentSession: जब आप कॉल SessionFactory.getCurrentSessionकरते हैं, तो यह आपको सत्र ऑब्जेक्ट प्रदान करेगा जो कि हाइबरनेट संदर्भ में है और आंतरिक रूप से हाइबरनेट द्वारा प्रबंधित किया जाता है। यह लेनदेन के दायरे के लिए बाध्य है।

जब आप कॉल करते हैं SessionFactory.getCurrentSession, तो यह एक नया बनाता हैSession तो यह यदि यह मौजूद नहीं है, अन्यथा उसी सत्र का उपयोग करें जो वर्तमान हाइबरनेट संदर्भ में है। लेन-देन समाप्त होने पर यह स्वचालित रूप से फ़्लश करता है और सत्र बंद करता है, इसलिए आपको इसे बाहरी रूप से करने की आवश्यकता नहीं है।

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

आपको hibernate.cfg.xml में निम्नलिखित संपत्ति जोड़ने की आवश्यकता हैgetCurrentSession विधि का उपयोग करने के :

<session-factory>
    <!--  Put other elements here -->
    <property name="hibernate.current_session_context_class">
          thread
    </property>
</session-factory>

क्या एक सर्वलेट प्रत्येक अनुरोध के लिए एक नया धागा नहीं खोलता है? इस प्रकार यदि यह एक जावा वेबप है, तो यह पहले से ही एक एकल-थ्रेडेड वातावरण नहीं है?
पारसकर

0
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
| Parameter            |                                openSession                                 |                                          getCurrentSession                                          |
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
| Session  creation    | Always open new session                                                    | It opens a new Session if not exists , else use same session which is in current hibernate context. |
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
| Session close        | Need to close the session object once all the database operations are done | No need to close the session. Once the session factory is closed, this session object is closed.    |
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
| Flush and close      | Need to explicity flush and close session objects                          | No need to flush and close sessions , since it is automatically taken by hibernate internally.      |
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
| Performance          | In single threaded environment , it is slower than getCurrentSession       | In single threaded environment , it is faster than openSession                                      |
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
| Configuration        | No need to configure any property to call this method                      | Need to configure additional property:                                                              |
|                      |                                                                            |  <property name=""hibernate.current_session_context_class"">thread</property>                       |
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+

-6

SessionFactory: "प्रति DataBase प्रति आवेदन एक सत्र" पर्याप्त है )।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.