2012-01-04 24 views
13

मैं एक सिस्टम बना रहा हूं, जहां क्लाइंट साइड से प्रत्येक अनुरोध सर्वर पक्ष पर एकाधिक थ्रेड बनाता है। प्रत्येक धागा तब एक या अधिक डीएओ का उपयोग कर रहा है (उस समय कुछ डीएओ का उपयोग एक से अधिक धागे द्वारा किया जा सकता है)। सभी डीएओ इंजेक्शन (@Autowired) वसंत द्वारा मेरे धागे वर्गों में इंजेक्शन दिए जाते हैं। प्रत्येक डीएओ को SessionFactory इंजेक्शन भी प्राप्त होता है।कई धागे में स्प्रिंग + हाइबरनेट सत्र प्रबंधन

इन एकाधिक डीएओ में हाइबरनेट सत्रों का प्रबंधन करने का उचित तरीका क्या होगा, इसलिए मैं बहुप्रचारित वातावरण की वजह से समस्याओं में नहीं भागूंगा (उदाहरण के लिए विभिन्न धागे से कुछ डीएओ एक ही सत्र में उसी सत्र का उपयोग करने की कोशिश कर रहे हैं)?

पर्याप्त होगा कि मैं हाइबरनेट कॉन्फ़िगरेशन में hibernate.current_session_context_class=thread निर्दिष्ट करता हूं और फिर डीएओ में हर बार काम करने के लिए बस SessionFactory.getCurrentSession() का उपयोग करता हूं? क्या यह उचित रूप से प्रति थ्रेड सत्रों का पता लगाएगा और तैयार करेगा?

उत्तर

15

हां। यह पर्याप्त है।

hibernate.current_session_context_classthread पर सेट करते समय, SessionFactory.getCurrentSession() से वापस आया गया सत्र ThreadLocal उदाहरण से है।

प्रत्येक धागे का अपना स्वतंत्र, स्वतंत्र रूप से ThreadLocal उदाहरण होगा, इसलिए अलग-अलग थ्रेड एक ही हाइबरनेट सत्र तक नहीं पहुंच पाएंगे।

SessionFactory.getCurrentSession() का व्यवहार यह है कि: यदि वर्तमान धागे में पहली बार कहा जाता है, तो एक नया सत्र खोला जाता है और लौटाया जाता है। यदि इसे एक ही धागे में फिर से बुलाया जाता है, तो वही सत्र वापस कर दिया जाएगा।

नतीजतन, आप SessionFactory.getCurrentSession() पर कॉल करके उसी लेनदेन कोड में विभिन्न डीएओ विधियों में उपयोग करने के लिए एक ही सत्र प्राप्त कर सकते हैं। यह आपको डीएओ विधि के इनपुट पैरामीटर के माध्यम से हाइबरनेट सत्र को पार करने से रोकता है, इस मामले में आपको एक ही लेनदेन कोड में कई अलग-अलग डीएओ विधियों को कॉल करना होगा।

+3

काम पूरा होने पर सत्र बंद करने के बारे में क्या, क्या यह स्वचालित रूप से किया जाता है? – MounirReg

+1

जब आप स्प्रिंग 3 के साथ हाइबरनेट करते हैं या बाद में आपको इस संपत्ति को स्थापित करने से बचना चाहिए क्योंकि वसंत के पास इसका स्वयं का कार्यान्वयन है जो स्प्रिंग के लिए हाइबरनेट सत्रों का प्रबंधन करने के लिए आवश्यक है। http://stackoverflow.com/a/18842593/3826713 – UCJava

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