2010-01-28 12 views
14

मुझे परिवर्तन (अद्यतन) की जांच करने के लिए लगातार डेटाबेस पंक्तियों की निगरानी करने की आवश्यकता है। यदि अन्य स्रोतों से कुछ बदलाव या अपडेट हैं तो कार्यक्रम को मेरे आवेदन पर निकाल दिया जाना चाहिए (मैं डब्ल्यूसीएफ का उपयोग कर रहा हूं)। परिवर्तन के लिए लगातार डेटाबेस पंक्ति सुनने के लिए कोई तरीका है?सी #/एसक्यूएल डाटाबेस श्रोता सहायता

मेरे पास एक ही तालिका में विभिन्न पंक्तियों की निगरानी करने के लिए अधिक संख्या में ईवेंट हो सकते हैं। प्रदर्शन के मामले में कोई समस्या है। मैं SQL सर्वर बैक एंड की निगरानी करने के लिए सी # वेब सेवा का उपयोग कर रहा हूं।

उत्तर

5

मुझे कुछ समय पहले एक बहुत ही समान आवश्यकता थी, और मैंने डेटा कतार में डेटा को धक्का देने के लिए इसे सीएलआर एसपी का उपयोग करके हल किया।

परिनियोजन को कम करने के लिए, मैंने SendMessage नामक एक छोटे से छोटे फ़ंक्शन के साथ एक सीएलआर एसपी बनाया जो कि केवल एक संदेश कतार में एक संदेश दबा रहा था, और इसे एक बार INSERT ट्रिगर (सामान्य ट्रिगर, सीएलआर ट्रिगर नहीं) का उपयोग करके मेरी टेबल पर बांध दिया गया था। ।

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

9

आप किसी आइटम को SQL Server Service Broker कतार में जोड़ने के लिए संबंधित तालिकाओं पर एक अद्यतन अद्यतन ट्रिगर का उपयोग कर सकते हैं। फिर अपनी वेब सेवा में भेजे गए कतारबद्ध अधिसूचनाएं हों।

एक और पोस्टर उल्लेख SqlDependency, जो मैं भी उल्लेख के बारे में सोचा लेकिन MSDN प्रलेखीकरण एक छोटे में यह एक खिड़कियों ग्राहक उदाहरण प्रदान करता है कि अजीब बात है, लेकिन यह भी इस सलाह प्रदान करता है:

SqlDependency उपयोग के लिए डिज़ाइन किया गया था एएसपी.नेट या मध्यम-स्तरीय सेवाओं में जहां अपेक्षाकृत छोटे निर्भरता वाले सर्वरों की संख्या डेटाबेस के विरुद्ध सक्रिय है। यह क्लाइंट अनुप्रयोगों में उपयोग के लिए डिज़ाइन नहीं किया गया था, जहां सैकड़ों या हजारों क्लाइंट कंप्यूटर में एक एकल डेटाबेस सर्वर के लिए स्थापित SqlDependency ऑब्जेक्ट्स हैं।

Ref

+0

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

+0

आपको डेटाबेस में सीधे पहुंच की आवश्यकता है। वास्तव में, आप खुद के विरोधाभास कर रहे हैं ?! –

2

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

2

मैं एक CLR समारोह या प्रकार कि कॉल सेवा सफलतापूर्वक के बाद डालने/अद्यतन करने/हटाने से से डेटा तालिकाओं के बारे में कुछ करने के विचार पर विचार। क्या यह स्थिति में भी अच्छा है?

शायद यह एक अच्छा विचार नहीं है, लेकिन मुझे लगता है कि यह तालिका ट्रिगर नरक में आने से भी बेहतर है।

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

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

समस्या के लिए एक बेहतर समाधान आपके डेटाबेस से डेटा संशोधन का पता लगाने के लिए जिम्मेदारी को आगे बढ़ाएगा। यह वास्तव में बहुत आसानी से और कुशलता से लागू किया जा सकता है।

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

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

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

उम्मीद है कि इससे मदद मिलती है।

1

आप SQL सर्वर अधिसूचना सेवा का उपयोग क्यों नहीं करते? मुझे लगता है कि यह वही चीज है जिसे आप ढूंढ रहे हैं। अधिसूचना सेवाओं के दस्तावेज के माध्यम से जाएं और देखें कि क्या आपकी आवश्यकता फिट बैठती है।

0

मुझे लगता है कि यहां कुछ महान विचार हैं; स्केलेबिलिटी परिप्रेक्ष्य से मैं कहूंगा कि चेक को बाहरी करना (उदाहरण के लिए पॉल सासिक का जवाब) शायद अब तक का सबसे अच्छा है (उसे +1)।

यदि किसी कारण से, आप चेक को बाहरी नहीं करना चाहते हैं, तो एक और विकल्प वॉचर और कॉलबैक स्टोर करने के लिए HttpCache का उपयोग करना होगा।

संक्षेप में, जब आप डीबी में रिकॉर्ड डालते हैं, जिसे आप देखना चाहते हैं, तो आप इसे कैश में भी जोड़ते हैं (एडी विधि का उपयोग करके) और उस पर एक SQLCacheDependency सेट करें, और जो भी तर्क आप चाहते हैं उसे कॉलबैक करें जब निर्भरता लागू की जाती है तो कॉल करने के लिए और आइटम को कैश से बाहर निकाला जाता है।

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