2010-09-16 17 views
7

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

मैं "साझा" मेमोरी एरिया बनाने की लाइन के साथ सोच रहा था, इस प्रकार विंडोज़ इसे प्रबंधित करने देता था, और इसे केवल सेवा में उपयोग करता था - लेकिन मुझे यकीन नहीं है कि सेवा मरने के बाद ऑब्जेक्ट जारी रहेगा।

कोई भी विचार?

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

+0

चेकआउट: ['PersistentDictionary'] (http://izlooite.blogspot.com/2011/04/persistent-dictionary.html) कक्षा –

उत्तर

3

आप Microsoft Enterprise Library से एक पर्सेंटेंट कैशिंग ब्लॉक का उपयोग कर सकते हैं।

यह कॉन्फ़िगर करने योग्य है और आप डेटाबेस और पृथक भंडारण जैसे कई बैकिंग स्टोर्स का उपयोग कर सकते हैं।

+0

अच्छा, यह बहुत दिलचस्प लग रहा है, धन्यवाद! –

0

पृथक भंडारण का उपयोग करने और वस्तु को स्मृति में इस तरह से बनाए रखने के बारे में कैसे?

+0

क्या आप" पृथक भंडारण "पर विस्तार कर सकते हैं? –

+1

लिंक देखें http://ondotnet.com/pub/a/dotnet/2003/04/21/isolatedstorage.html – Madeleine

+0

मेरे ज्ञान को समृद्ध करने के लिए धन्यवाद। हालांकि, यह फाइलों को भी लिख रहा है - और मेरे पास कोई अनुमति समस्या नहीं है, इसलिए पृथक भंडारण मेरी स्थिति में मूल्य नहीं जोड़ता है। –

2

आप मेमकैच, या रेडिस का उपयोग कर सकते हैं (जो डिस्क पर इसका डेटा भी जारी रखता है, लेकिन इसे स्वचालित रूप से संभालता है)।

Memcached with Windows and .NET

+1

मेमकैड और रेडिस वास्तव में जानना दिलचस्प है लेकिन मुझे लगता है कि वे एक ओवरकिल होंगे। मुझे केवल कुछ ऑब्जेक्ट्स जैसे स्टोर में कई तारों और पूर्णांकों को स्टोर करने की आवश्यकता है। मैं डिस्क इंटरैक्शन के साथ ऐसा कर सकता हूं लेकिन मैं स्पष्ट कारणों से मेमोरी इंटरैक्शन पसंद करता हूं। मैं .NET या Windows में अंतर्निहित सुविधा की तलाश में था। –

+0

ठीक है, आप कोशिश कर सकते हैं और फिर तय कर सकते हैं कि आपकी भावना सही है या नहीं ... वैसे भी पर्सिस्टेंक कैशिंग ब्लॉक का उपयोग करने के लिए जेएमएसरवेरा की सलाह आपके लिए एक अच्छा विकल्प हो सकती है। – mamoo

0

यहां तक ​​कि अगर, उदाहरण के लिए, आप डेटा कुछ अन्य नेटवर्क पीसी की एक शेयर्ड मेमोरी पर रखें:

http://code.google.com/p/redis/

आप भी इस सवाल पर एक नज़र ले सकता है , आप कैसे "गारंटी" देंगे कि नेटवर्क पीसी लटका/पुनरारंभ/रोक/आदि नहीं होगा? उस स्थिति में आपकी सेवा वैसे भी लगातार डेटा खो जाएगी।

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

ध्यान दें कि, स्मृति की अस्थिर प्रकृति (रैम) की वजह से आप पहले से मौजूद डेटा को फिर से लोड नहीं कर सकते, सिस्टम को पुनरारंभ करने से पहले; जब तक आप डिस्क पर स्टोर/पुनः लोड करने के लिए कुछ तंत्र का उपयोग नहीं करते हैं।

--EDIT--

उस मामले में, कैसे MSMQ का उपयोग कर के बारे में? तो आप कतार में सब कुछ धक्का दे सकते हैं, और भले ही आपकी सेवा पुनरारंभ हो जाए, फिर भी यह कतार में वस्तुओं की तलाश करेगी और आगे बढ़ेगी।

+0

यदि एक ही पीसी पुनरारंभ होता है, तो मुझे लगातार डेटा की आवश्यकता नहीं है। मैं केवल उस चरम मामले को कवर करना चाहता हूं जिसमें मेरी सेवा दुर्घटनाग्रस्त हो जाती है और स्वचालित रूप से पुनरारंभ होती है। –

+0

@Eldad: कृपया अपनी टिप्पणी के जवाब में मेरा संपादन देखें। –

1

मुझे नहीं लगता कि डिस्क पर बने रहना मुश्किल क्यों होगा।

db4o का उपयोग करके आप उन उदाहरणों को जारी रख सकते हैं जिनके साथ आप पहले से काम कर रहे हैं।

+0

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

+0

स्वत: पुनरारंभ करने के अनावश्यक उपयोग से बचने की अपेक्षित विफलता परिदृश्यों को संभालें, और चरम परिदृश्य के लिए इसे अनदेखा करें, यह अभी भी दुर्घटनाग्रस्त है/क्योंकि आपने पहले ही कहा है कि बॉक्स पुनरारंभ होता है तो आपको डेटा खोने की परवाह नहीं है। – eglasius

+0

ठीक है, यह सबसे अच्छा उम्मीद कर रहा है :-) जाहिर है, मैं कोड नहीं जा रहा हूं जैसे कि सेवा पर टिके रहने पर मुझे परवाह नहीं है। मैं इसे रखने के लिए अपनी पूरी कोशिश करूंगा, और फिर भी ... लेकिन मुझे डेटा को बनाए रखने की लागत में वजन करने की आवश्यकता है। –

3

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

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

+0

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

+1

हाँ मुझे नहीं लगता कि आपको वास्तव में वह विकल्प है। आप समय-समय पर इसे डिस्क पर लिख सकते हैं, लेकिन सेवा समाप्त होने से ठीक पहले आप इसे जारी नहीं रख सकते हैं - उदाहरण के लिए, यदि आप सर्वर क्रैश करते हैं तो यह बहुत देर हो चुकी है –

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