2009-07-19 15 views
7

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

मैंने एनएचबर्ननेट और SQLite डेटाबेस का उपयोग करने का निर्णय लिया है, इसलिए मैं एनएचबीरनेट पर बहुत कुछ पढ़ रहा हूं, ट्यूटोरियल्स के बाद और कुछ नमूना अनुप्रयोग लिख रहा हूं, और इस बारे में पूरी तरह उलझन में हूं कि मुझे इसके बारे में कैसे जाना चाहिए!

मेरे पास सवाल है: मेरे सत्रों का प्रबंधन करने का सबसे अच्छा तरीका क्या है? बस छोटी राशि है कि मुझे समझ नहीं से, इन सभी संभावनाओं मुझ पर बाहर कूद:

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

रणनीति किस तरह का होना चाहिए मैं सभ्य प्रदर्शन प्राप्त करने के लिए उपयोग करता हूं कि संभवतः सैकड़ों ग्राहकों से प्रति सेकंड कई अपडेट, आवेषण, हटाना और प्रश्न हो सकते हैं, और उन्हें सभी एक दूसरे के साथ संगत होना चाहिए?

एक और छोटा सवाल: मैं लेनदेन का कुशल तरीके से उपयोग कैसे करना चाहिए? क्या हर एक बदलाव अपने लेन-देन में होना ठीक है, या क्या यह बुरी तरह से प्रदर्शन करने जा रहा है जब मेरे पास सैकड़ों ग्राहक ग्रिड में कोशिकाओं को बदलने की कोशिश कर रहे हैं? क्या मुझे यह पता लगाने की कोशिश करनी चाहिए कि समान अपडेटों को एक साथ कैसे बढ़ाया जाए और उन्हें एक ही लेनदेन में रखा जाए, या यह बहुत जटिल हो रहा है? क्या मुझे इसके अधिकांश लेनदेन की भी आवश्यकता है?

उत्तर

8

मैं सर्वर पर प्रति अनुरोध एक सत्र का उपयोग करता हूं, और प्रति सत्र एक लेनदेन का उपयोग करता हूं। ऐप परिपक्व होने से पहले मैं प्रदर्शन के लिए अनुकूल नहीं होगा।

अपने समाधान करने के लिए उत्तर: आप प्रदर्शन के मुद्दों यहाँ होगा क्योंकि सत्र सुरक्षित थ्रेड नहीं है और आप सभी कॉल लॉक करने के लिए करना होगा:

  • एक ही सत्र है कि हमेशा ही खुल जाता है कि सभी ग्राहकों का उपयोग है सत्र।
  • प्रत्येक क्लाइंट के लिए एक सत्र है जो कनेक्ट करता है और समय-समय पर इसे फ्लश करता है: आपके पास प्रदर्शन समस्याएं होंगी क्योंकि क्लाइंट द्वारा उपयोग किए गए सभी डेटा कैश किए जाएंगे।आपको कैश से पुराने डेटा के साथ समस्याएं भी दिखाई देगी।
  • प्रत्येक बार जब भी मुझे किसी भी निरंतर संस्थाओं का उपयोग करना होता है, तो एक सत्र खोलें और जैसे ही अपडेट, डालें, डिलीट करें या क्वेरी पूरी हो जाएं: आपको यहां कोई प्रदर्शन समस्या नहीं होगी। एक नुकसान संभव समरूपता या दूषित डेटा समस्याएं हैं क्योंकि संबंधित एसक्यूएल स्टेटमेंट एक ही लेनदेन में निष्पादित नहीं होते हैं।
  • प्रत्येक क्लाइंट के लिए एक सत्र है, लेकिन इसे डिस्कनेक्ट करें और इसे उपयोग करने की आवश्यकता होने पर ही इसे पुनः कनेक्ट करें: NHibernate में पहले से ही कनेक्शन प्रबंधन है और यह पहले से ही बहुत अनुकूलित है।
  • उपर्युक्त जैसा ही है, लेकिन इसे कनेक्ट रखें और केवल निष्क्रियता की एक निश्चित अवधि के बाद इसे डिस्कनेक्ट करें: समस्याएं पैदा होंगी क्योंकि एसक्यूएल कनेक्शन की मात्रा सीमित है और आपके आवेदन के उपयोगकर्ताओं की मात्रा को भी सीमित कर देगी।
  • इकाइयों को अलग रखें और परिवर्तनों को करने के लिए केवल 10 मिनट संलग्न करें: अलग-अलग इकाइयों में पुराने डेटा की वजह से समस्याएं पैदा होंगी। आपको स्वयं को परिवर्तनों को ट्रैक करना होगा, जो आपको कोड के टुकड़े के साथ समाप्त कर देता है जो सत्र की तरह दिखता है।

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

+0

मैं इसे अनुकूलित करने की कोशिश नहीं कर रहा हूं; मैं सिर्फ यह समझने की कोशिश कर रहा हूं कि यह करने के लिए अलग-अलग तरीके क्या हैं, वे आम तौर पर अच्छे हैं या अच्छे नहीं हैं, इससे पहले कि वे एक से पहले स्केल करें और प्रदर्शन करें। यह सुनिश्चित करने के बारे में है कि मैं कुछ भी बेवकूफ नहीं करता और एक उचित समझदार समाधान का चयन करता हूं। प्रदर्शन ट्यूनिंग नहीं। तो, आपके उत्तर के लिए, "अनुरोध" से आपका क्या मतलब है - क्या "अनुरोध"? आपका मतलब हर बार एक खिलाड़ी कुछ करता है? – IRBMe

+0

हाँ अनुरोध के साथ मेरा मतलब है "प्रत्येक बार जब कोई खिलाड़ी कुछ करता है" या "क्लाइंट से सर्वर पर प्रत्येक कॉल" – Paco

+0

आपके द्वारा बाद में जोड़े गए संपादन को पढ़ने के बाद, मेरे पास आपके द्वारा जो कुछ कहा गया है उसके बारे में एक प्रश्न है।प्रति क्लाइंट में एक सत्र होने के संबंध में, मैंने सोचा कि NHibernate गारंटी देता है कि ISession.Find जैसी विधियां कभी भी खराब डेटा नहीं लौटाएंगी। दूसरा, आप रिकनेक्ट/डिसकनेक्ट का उपयोग करके निराश होना प्रतीत होता है क्योंकि "एनएचबर्ननेट में पहले से ही कनेक्शन प्रबंधन है" मैनुअल का उपयोग एक समवर्ती उदाहरण में किया जाता है जिसे "स्वचालित संस्करण के साथ लंबा सत्र" कहा जाता है। – IRBMe

0

मैं सबकुछ स्मृति में रखना चाहता हूं, या तो जर्नल बदलता है या आवधिक ऑफ़लाइन स्नैपशॉट लेता हूं।

+0

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

1

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

आप Session and Transaction पर हाइबरनेट के दस्तावेज़ीकरण को भी देखना चाहते हैं।

0

NHibernate Best Practices with ASP.NET के माध्यम से पढ़ा गया है, यहां शुरुआत के लिए कुछ बहुत अच्छी युक्तियां दी गई हैं। जैसा कि पहले से ही एक ISession के साथ बहुत सावधान रहना है क्योंकि यह थ्रेडसेफ नहीं है, इसलिए बस इसे ध्यान में रखें।

यदि आपको कुछ और जटिल परिसर की आवश्यकता है तो NHibernate.Burrow contrib प्रोजेक्ट में एक नज़र डालें। यह कुछ कहता है "असली पावर बरो प्रदान करता है कि एक बुरो वार्तालाप एकाधिक http अनुरोधों पर फैल सकता है"।

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