2014-10-07 13 views
5

मुझे लगता है कि अनुसूचित कार्यों कि मेरे Windows सेवा एक टाइमस्टैम्प बंद आधारित प्रक्रिया चाहिए और मैं सोच रहा था क्या विकल्प मैं मतदान के लिए इसवैकल्पिक

SELECT * 
FROM mydb 
WHERE SYSUTCDATE() >= timestamp 

मैं की तरह तालिका है शामिल एक MSSQL तालिका है डी शायद कम से कम हर 5 सेकंड में टेबल मतदान करने की जरूरत है। असल में मैं चाहता हूं कि मेरी विंडोज सेवा तालिका में टाइमस्टैम्प द्वारा निर्धारित समय पर डेटा को संसाधित करे।

मेरे लिए यह सबसे प्रभावी तरीका प्रतीत नहीं होता है। मैंने पहले ही डीएमएल & सीएलआर ट्रिगर्स में देखा है और मुझे नहीं लगता कि वे काम करेंगे जब डेटा बदलता है और टाइमस्टैम्प पास नहीं होने पर वे आग लगेंगे। विचार?


अद्यतन 2:

मुझे एहसास हुआ है कि इसे "अनुसूचित कार्य" शब्दों का एक गरीब पसंद थी तो मैं और अधिक विस्तार में यह वर्णन करने के लिए कोशिश करेंगे।

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


अद्यतन 1:

संदेश कतार

मैं पता लगा नहीं है कि कैसे इस उचित समय पर कतार पर संदेशों डाल देंगे।

SqlDependency

मैं Detecting Changes with SqlDependency से उदाहरण कोड का उपयोग कर समस्या हो रही है। किसी कारण से OnChange ईवेंट केवल शुरुआत में निकाल दिया जाता है, बाद में कुछ भी नहीं होता है।

अपडेट: मुझे नहीं लगता कि एसक्लड परस्परेंसी काम करेगा क्योंकि तालिका में डेटा ट्रिगर आग बनाने के लिए नहीं बदलेगा।

void Initialization() 
{ 
    // Create a dependency connection. 
    SqlDependency.Start(connectionString, queueName); 
} 

void SomeMethod() 
{ 
    // Assume connection is an open SqlConnection. 

    // Create a new SqlCommand object. 
    using (SqlCommand command=new SqlCommand(
     "SELECT timestamp,othercolumn FROM mydb WHERE SYSUTCDATE() >= timestamp", 
     connection)) 
    { 

    // Create a dependency and associate it with the SqlCommand. 
    SqlDependency dependency=new SqlDependency(command); 
    // Maintain the refence in a class member. 

    // Subscribe to the SqlDependency event. 
    dependency.OnChange += new OnChangeEventHandler(OnDependencyChange); 

    // Execute the command. 
    using (SqlDataReader reader = command.ExecuteReader()) 
    { 
     // Process the DataReader. 
    } 
} 
+7

क्या आपने इसके बजाय एक संदेश कतार का उपयोग करने पर विचार किया है? – recursive

+3

एसक्यूएल पर निर्भरता का प्रयास करें: http://msdn.microsoft.com/en-us/library/62xk7953(v=vs.110).aspx –

+2

क्या आपने इन्हें नौकरियों में बदलने और उन्हें SQL सर्वर एजेंट के माध्यम से चलाने पर विचार किया है? –

उत्तर

3

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

SqlDependency बदले में आसान और उपयोग करने में आसान नहीं है, भले ही आपके पास कोई क्वेरी है जो समर्थित है। आपके मामले में, जैसा कि आपने देखा है, यह काम नहीं करता है क्योंकि डेटाबेस इंजन तब तक अधिसूचना पोस्ट नहीं करेगा जब तक कि डेटा वास्तव में बदलता नहीं है - इससे कोई फर्क नहीं पड़ता कि समय बीतने के बाद क्वेरी के परिणाम बदल जाएंगे। जैसा कि निक ने इंगित किया है, हर 5 सेकंड में डेटाबेस को मतदान करना आम तौर पर ठीक है। यह नगण्य भार उत्पन्न करता है, बशर्ते आपने mydb.timestamp पर एक इंडेक्स बनाया है (और यह कि आप इसे बनाना चाहते हैं, क्योंकि प्रत्येक 5 सेकंड में टेबल स्कैन करने के बाद ठीक नहीं है)।

एकमात्र आपत्ति विलंबता है: यदि शेड्यूल के लिए कोई भी अपडेट प्रत्येक 5 सेकंड में एक बार से जल्द होना चाहिए, तो मतदान पर्याप्त नहीं है। इस मामले में, आप सेवा ब्रोकर का उपयोग कर सकते हैं और कतार में अधिसूचना पोस्ट कर सकते हैं तत्काल कुछ परिवर्तन (संभवतः एक ट्रिगर से)। वास्तव में, SqlDependency कवर के तहत एक ही दृष्टिकोण का उपयोग करता है, ताकि आप किसी भी तालिका में परिवर्तनों को अधिसूचना प्राप्त करने के लिए SELECT * FROM table पर निर्भरता बना सकें, और उसके बाद आपको जो चाहिए उसे प्राप्त करने के लिए वास्तविक क्वेरी करें (संभवतः पता लगाएं कि कुछ भी नहीं है)। सावधान रहें, हालांकि: कई तेज़ अपडेटों से उलझन में इस सही के लिए कोड प्राप्त करना या कनेक्शन तोड़ना मामूली नहीं है और शायद इसके लायक नहीं है, क्योंकि समय-समय पर पुनः लोड करने के विपरीत।

+0

धन्यवाद। डेटाबेस में सभी कार्यों को निर्धारित करने के लिए मेरा तर्क था क्योंकि मैंने सोचा था कि यह चीजों को सरल बना देगा क्योंकि इसे प्रोग्रामेटिक रूप से प्रबंधित करने के लिए बहुत अधिक ओवरहेड होगा। मैं अपने ओपी में अधिक जानकारी प्रदान करूंगा। – user3811205

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