2009-10-08 8 views
35

का उपयोग क्यों न करें, जबकि वसंत के ओपनसेशन/EntityManagerInViewFilter के विषय पर बहुत सी पोस्ट लिखी गई हैं, मुझे कोई भी त्रुटि नहीं मिली जो इसकी त्रुटियों का उल्लेख करती है।वसंत के OpenEntityManagerInViewFilter

  1. फिल्टर एक सर्वलेट अनुरोध
  2. फिल्टर एक EntityManager खोलता को बीच में रोक और करने के लिए इसे बांधता है: मैं क्या समझते हैं, और एक @Transactional सेवा परत का उपयोग एक ठेठ स्तरित वेब अनुप्रयोग वास्तुकला संभालने से, इस प्रकार फिल्टर काम करता है वर्तमान धागा
  3. वेब नियंत्रक
  4. वेब नियंत्रक कहा जाता है सेवा कॉल
  5. लेन-देन इंटरसेप्टर एक नई लेन-देन शुरू होता है, धागा बाध्य EntityManager प्राप्त करता है और लेन-देन के लिए यह बांधता
  6. सेवा कहा जाता है, EntityManager के साथ कुछ सामान करता है, तो रिटर्न
  7. लेन-देन इंटरसेप्टर flushes EntityManager फिर लेन-देन
  8. वेब नियंत्रक दृश्य तैयार करता है, तो रिटर्न
  9. देखें बनाया गया है
  10. फ़िल्टर EntityManager और बंद कर देता है वर्तमान थ्रेड से इसे अनबिंड करता है

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

2 इस के साथ समस्याओं देखें:

  1. कई आलसी संघों लोड हो रहा है कई डेटाबेस लेनदेन में परिणाम होगा, प्रदर्शन पर एक संभव हिट
  2. जड़ वस्तु और उसके आलसी संघों विभिन्न डेटाबेस लेनदेन में लोड किए गए हैं, इसलिए डेटा संभवतः पुराना हो सकता है (उदाहरण के लिए थ्रेड 1 द्वारा लोड रूट, थ्रेड 2 द्वारा अद्यतन रूट एसोसिएशन, थ्रेड द्वारा लोड रूट एसोसिएशन 1)

एक ओर, इन 2 मुद्दों का उपयोग करने से इनकार करने के लिए पर्याप्त लगता है फ़िल्टर (प्रदर्शन हिट, डेटा असंगतता)। दूसरी तरफ, यह समाधान बहुत सुविधाजनक है, कोड की कई पंक्तियों को लिखने से बचाता है, समस्या 1 ध्यान देने योग्य नहीं हो सकता है और समस्या 2 शुद्ध परावर्तक हो सकती है।

आपको क्या लगता है?

धन्यवाद!

उत्तर

9

जैसा कि आपने कहा था, OpenSessionInView फ़िल्टर वेब अनुप्रयोगों में बहुत सुविधाजनक है। आपके द्वारा उल्लिखित सीमाओं के बारे में:

1) कई आलसी संघों को लोड करना परिणामस्वरूप कई डेटाबेस लेनदेन, प्रदर्शन पर एक संभावित हिट होगा।

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

2) जड़ वस्तु और उसके आलसी संघों विभिन्न डेटाबेस लेनदेन में लोड किए गए हैं, तो डेटा संभवतः पुरानी हो सकती है (जैसे जड़ धागा 1 द्वारा लोड, जड़ धागा 2 के द्वारा अद्यतन संघों, जड़ संघों धागा 1 द्वारा लोड)।

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

IMHO, OpenSessionInView के साथ अधिक महत्वपूर्ण नुकसान तब होता है जब आप अपनी सेवा परत को गैर-वेब संदर्भ में पुन: उपयोग करना चाहते हैं। आपके विवरण से, आपको उस समस्या का प्रतीत नहीं होता है।

4

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

4

OpenSessionInViewFilter के साथ सामना करने वाले प्रमुख मुद्दों में से एक AJAX ऐप्स और जावास्क्रिप्ट का उपयोग कर रहा है। यदि आप ग्रिड, या कुछ यूआई घटकों को प्रस्तुत करने के लिए जावास्क्रिप्ट का उपयोग कर रहे हैं; एक आलसी लोड है (आप फ़िल्टर को चालू करने पर विचार कर रहे हैं); और एक अपवाद फेंक दिया जाता है। आपका एप्लिकेशन UI प्रतिपादन टॉस के लिए जाता है। डेटा कभी दिखाई नहीं दे सकता है, पेज अजीब जावास्क्रिप्ट अपवाद फेंकना शुरू कर देता है, जिसके लिए आपको हैंडल करने के लिए अतिरिक्त जेएस कोड लिखना होगा। और आप उपयोगकर्ताओं को डीबी अपवादों को उजागर कर रहे हैं (एक अच्छा विचार नहीं)।

नियमित एप्लिकेशन में इन अपवादों को कैद किया जा सकता है और एक मान्य उपयोगकर्ता अपवाद फेंक दिया जा सकता है।

1

यदि आपका आवेदन एक बहु स्तरित आर्किटेक्चर है (विभिन्न जेवीएम पर तैनात परत देखें और सेवा परत अलग-अलग वीएम पर तैनात की जाएगी), तो सत्र को खुले राज्य में रखें, समझ में नहीं आता है। यदि आपकी सेवा परत आपके ऐप परत से स्वतंत्र है तो मैं किसी भी OpenSessionViewFilter का उपयोग नहीं देखूंगा।