2013-05-31 8 views
5

हमारे आवेदन में हम वसंत और हाइबरनेट का उपयोग कर रहे हैं।सत्र फैक्ट्री के बजाय डीएओ बीन को सत्र वस्तु इंजेक्ट करें?

सभी डीएओ कक्षाओं में हमारे पास सत्र कारखाना ऑटो वायर्ड है और प्रत्येक डीएओ विधियां getCurrentSession() विधि को कॉल कर रही हैं।

प्रश्न यह है कि क्यों हम प्रोटोटाइप स्कोप में सत्र फैक्ट्री ऑब्जेक्ट के बजाय सत्र ऑब्जेक्ट इंजेक्ट नहीं करते हैं? यह हमें CurrentSession प्राप्त करने के लिए कॉल बचाएगा।

मुझे लगता है कि पहली विधि सही है लेकिन ठोस परिदृश्य की तलाश है जहां दूसरी विधि त्रुटियों को फेंक देगी या खराब प्रदर्शन हो सकता है?

+0

ही एक मामला पढ़ [दस्तावेज़] (http://docs.jboss.org/hibernate/orm/3.5/javadoc/org/hibernate/Session.html) जो कहते हैं 'सत्र एक अपवाद फेंकता है तो लेन-देन करना होगा वापस लुढ़काया और सत्र छोड़ दिया। सत्र की आंतरिक स्थिति डेटाबेस के साथ संगत के बाद अपवाद –

+0

occurs.' नहीं हो सकता है आप 'सुई javax.persistence.EntityManager' बेहतर हैं, लेकिन उस के लिए, आप के बजाय जेपीए का उपयोग कर पर जोर पड़ता है। – Lion

उत्तर

3

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

अधिकांश स्थितियों के लिए सत्र लेनदेन का दायरा होना चाहिए, यानी लेनदेन शुरू होने पर एक नया सत्र खोला जाता है और फिर लेनदेन समाप्त हो जाने के बाद स्वचालित रूप से बंद हो जाता है। कुछ मामलों में इसे दायरे के अनुरोध के लिए बढ़ाया जाना पड़ सकता है।

यदि आप सत्र Factory.currentSession का उपयोग करने से बचना चाहते हैं - तो आपको इसे प्राप्त करने के लिए अपने स्वयं के दायरे कार्यान्वयन को परिभाषित करने की आवश्यकता होगी।

यह ऐसा कुछ है जो पहले से ही जेपीए के लिए प्रॉक्सी का उपयोग कर लागू किया गया है। EntaManagerFactory के बजाय जेपीए EntityManager इंजेक्शन के मामले में है। @Autowired के बजाय एक नया @PersistenceContext एनोटेशन है। शुरुआत के दौरान प्रॉक्सी बनाया और इंजेक्शन दिया जाता है। जब किसी भी विधि को लागू किया जाता है तो प्रॉक्सी वास्तविक EntityManager कार्यान्वयन (SessionFactory.getCurrentSession के समान कुछ का उपयोग करके) को प्राप्त करेगा और इसे प्रतिनिधि करेगा।

इसी तरह की चीज हाइबरनेट के लिए भी लागू की जा सकती है, लेकिन अतिरिक्त जटिलता इसके लायक नहीं है। बेसडाओ में एक getSession विधि को परिभाषित करना बहुत आसान है जो आंतरिक रूप से सत्र Factory.getCurrentSession() को कॉल करता है। इसके साथ सत्र का उपयोग करने वाला कोड सत्र इंजेक्शन के समान है।

3

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

वास्तव में getCurrentSession हर कॉल पर एक नया सत्र नहीं खुलेगा ... इसके बजाय, यह सत्र current session context से आबद्ध हैं (जैसे, धागा, JTA Transacion या बाह्य प्रबंधित संदर्भ) का पुन: उपयोग होगा।

तो चलिए इसके बारे में सोचें; मान लें कि आपकी व्यावसायिक परत में एक ऐसा ऑपरेशन है जिसे कई डेटाबेस तालिकाओं को पढ़ने और अपडेट करने की आवश्यकता होती है (जिसका मतलब है कि कई डीएओ के साथ प्रत्यक्ष या अप्रत्यक्ष रूप से बातचीत करना) ... बहुत सामान्य परिदृश्य सही है? कस्टम रूप से जब इस प्रकार का ऑपरेशन विफल रहता है तो आप वर्तमान ऑपरेशन में जो कुछ भी हुआ है उसे रोलबैक करना चाहते हैं? तो, इस "विशेष" मामले के लिए, किस तरह की रणनीति उचित लगती है?

  1. कई सत्रों में फैले हुए, प्रत्येक व्यक्ति अपनी तरह की वस्तुओं का प्रबंधन करता है और विभिन्न लेन-देन के लिए बाध्य होता है।
  2. इस ऑपरेशन से संबंधित वस्तुओं का प्रबंधन करने वाला एक सत्र है ... लेनदेन की अपनी व्यावसायिक आवश्यकताओं के अनुसार गणना करें।

संक्षेप में, साझा सत्र और डेमेटिंग लेनदेन प्रभावी ढंग से आपके एप्लिकेशन प्रदर्शन में सुधार नहीं करेंगे, यह आपके आवेदन की कार्यक्षमता का हिस्सा है।

मैं गहराई से सिफारिश करेंगे आप Chapter 2 और Hibernate Core Reference Manual की Chapter 13 पढ़ने के लिए बेहतर भूमिकाओं को समझने के लिए कि ढांचे के भीतर SessionFactory, Session और Transaction नाटकों। यह भी काम की इकाइयों के साथ ही लोकप्रिय सत्र पैटर्न और विरोधी पैटर्न के बारे में इच्छा सिखा देगा।

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