2010-07-09 16 views
5

प्रश्न वैचारिक के बाद से थोड़ा लंबा है। मुझे आशा है कि यह एक बुरा पढ़ने :)नियंत्रक (वसंत प्रबंधित बीन) स्कोप प्रश्न: सिंगलटन, अनुरोध या सत्र?

मैं एक प्रदर्शन महत्वपूर्ण वसंत MVC/टाइलें वेब-एप्लीकेशन (10,000 उपयोगकर्ताओं ठेठ लोड) में काम कर रहा हूँ नहीं है। हम एक अपडेट कर्मचारी स्क्रीन लोड करते हैं, जहां हम मल्टीएक्शन कंट्रोलर के माध्यम से अपडेट के लिए कर्मचारी विवरण स्क्रीन (कर्मचारी कर्मचारी ऑब्जेक्ट से बाध्य) लोड करते हैं। इस स्क्रीन पर कई टैब हैं, लेकिन केवल टैब 1 में अद्यतन डाटाबेस डेटा है। मूल रूप से संदर्भ के लिए शेष टैब केवल पढ़ने के लिए सामान हैं।

जरूरत नहीं कहने के लिए, हम एक आलसी तरीके से इन केवल पढ़ने के लिए टैब लोड करने के लिए तय कर लिया है यानी, जब प्रत्येक टैब सक्रिय होता है, हम सर्वर से डेटा लाने के लिए एक ajax कॉल (एक बार) आग। हम अद्यतन दृश्य लोडिंग विधि के माध्यम से सबकुछ लोड नहीं करते हैं। याद रखें: यह एक बार, केवल पढ़ने के लिए डेटा है।

अब, मैं एक दुविधा में हूं। मैंने इन अजाक्स कॉलों को संभालने के लिए "अजाक्स कंट्रोलर" नामक एक और मल्टीएक्शन कंट्रोलर बनाया है। अब, मेरे प्रश्न:

  1. इस नियंत्रक के लिए सबसे अच्छा दायरा क्या होना चाहिए?

विचार: यदि मैं इसे अनुरोधित करता हूं, तो 10,000 उपयोगकर्ता एक साथ इस बीन के 10,000 उदाहरण बना सकते हैं: स्मृति समस्या। यदि मैं इसे सत्र स्कॉप्ड करता हूं, तो प्रति उपयोगकर्ता सत्र में एक बनाया जाएगा। इसका मतलब है, जब 10,000 उपयोगकर्ता ऐप में लॉग इन करते हैं, भले ही वे अजाक्स कंट्रोलर विधियों को हिट करते हैं, तो उनमें से प्रत्येक के पास एक बीन होगा।

  1. फिर, सिंगलटन इस नियंत्रक के लिए सबसे अच्छा गुंजाइश है?

विचार: वसंत जूते के दौरान एक सिंगलटन बीन बनाया जाएगा, और यह बहुत ही उदाहरण पूरे समय प्रदान किया जाएगा। बढ़िया है।

  1. क्या हैंडलर विधियों (जैसे fetchTab7DataInJsonFormat) स्थिर होना चाहिए और कक्षा से जुड़ा होना चाहिए?

विचार: इस मामले में, स्थैतिक तरीकों को सैद्धांतिक रूप से दायरे के साथ संघर्ष कर सकते हैं? उदाहरण के लिए: क्या स्कोप = "सत्र"/"अनुरोध" + स्थैतिक विधियां समझ में आती हैं? मैं पूछता हूं क्योंकि भले ही प्रत्येक उपयोगकर्ता सत्र में अपना स्वयं का अजाक्स कंट्रोलर बीन होता है, लेकिन हैंडलर विधियां वास्तव में कक्षा से जुड़ी होती हैं, न कि उदाहरण। इसके अलावा, क्या स्कोप = "सिंगलटन" + स्थिर हैंडलर विधियों को समझ में आता है?

  1. मैं AjaxController मैन्युअल में सिंगलटन डिजाइन पैटर्न को लागू कर सकते हैं?

विचार: यदि मैं सृजन को नियंत्रित करता हूं तो क्या होगा: मूल रूप से गोफ सिंगलटन करें। तो दायरे विनिर्देश क्या कर सकते हैं? स्कोप सत्र/अनुरोध निश्चित रूप से वे कई उदाहरण नहीं बना सकते हैं?

  1. जो कुछ तंत्र (सेम विनिर्देश/डिजाइन पैटर्न/स्थिर विधि) द्वारा, तो, मैं AjaxController में से एक एक उदाहरण के लिए प्रबंधन कैसे करूँ: सिंक्रनाइज़ किया करने के लिए इन स्थितिक प्रणालियां की आवश्यकता होगी? मुझे नहीं लगता, क्योंकि अगर स्टेटिक हैंडलर विधियां सेवाओं से बात कर सकती हैं (जो डीबी/डब्लूएस/एमक्यू इत्यादि से बात करती है) जो मुझे लगता है, तो मुझे लगता है कि स्थिर अनुरोधों में प्रवेश करने वाले प्रत्येक अनुरोध धागे को उनके थ्रेड आईडी के दाएं से वापस कर दिया जाएगा? ऐसा नहीं है कि उपयोगकर्ता 1 स्थिर विधि में प्रवेश करता है, और फिर उपयोगकर्ता 2 वापस आने से पहले स्थिर विधि में प्रवेश करता है, और फिर दोनों को कुछ खराब डेटा मिलता है? यह शायद मूर्खतापूर्ण है, लेकिन मैं निश्चित होना चाहता हूं।

मैं उलझन में हूँ। मैं मूल रूप से सभी ग्राहकों के लिए सभी अनुरोधों को नियंत्रक बीन सर्विसिंग का बिल्कुल एक उदाहरण चाहता हूं।

महत्वपूर्ण नोट: AjaxController सेम कहीं और इंजेक्शन नहीं है, यह अलग से मौजूद है। AJAX कॉल के माध्यम से यह विधियां हिट होती हैं।

उत्तर

3

यदि मैं यह कर रहे थे, मैं निश्चित रूप से उस में और उस में किसी भी राज्य के बिना स्थिर तरीकों बिना LazyLoadController सिंगलटन होगा।

इसके अलावा, आप निश्चित रूप से एकमात्र मैन्युअल का दृष्टांत नहीं करना चाहिए, यह वसंत के सामान्य प्रणाली का उपयोग करें और ढांचे नियंत्रण सब कुछ जाने के लिए बेहतर है।

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

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

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

+0

मेरे हिस्से पर भारी गलती। LazyLoadController AjaxController है। मैंने प्रश्न लिखने के दौरान एक नाम के बारे में सोचा, और फिर प्रश्नों के दौरान दूसरे नाम पर वापस आ गया। माफ़ी माफ़ी, मैंने पोस्ट संपादित किया है। हां, आपको उपयोगकेस सही मिला है। असल में, मेरे पास एक सेवा परत है जो ठीक से करती है, और यह अजाक्स कंट्रोलर केवल अनुरोध प्रेषक और प्रतिक्रिया हैंडलर के रूप में कार्य करता है। मेरे कुछ संदेह संघर्ष परिदृश्यों के संबंध में रहते हैं। वर्तमान में मेरा अजाक्स कंट्रोलर सिंगलटन है, और इसमें अनुरोधों को संसाधित करने और सेवा परत से बातचीत करने के लिए स्थिर तरीके हैं। इस सेटअप में कुछ भी गलत है? – SpringConfused

+0

मैं देखता हूं। स्पष्टीकरण के साथ मेरा जवाब अपडेट किया गया क्यों स्थिर तरीके गलत हैं। –

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