17

पर अपडेट को सूचित या पुश करने के लिए अपना डेटाबेस (एसक्यूएल) चाहता हूं। मैं इस एप्लिकेशन को VB.net 2010 और SQL 2008 पर विकसित कर रहा था।
मैं चाहता था कि ग्राहकों को डीबी पर अपडेट के लिए अधिसूचित किया जाए, और एक टाइमर का उपयोग करके निर्दिष्ट मिनट में परिवर्तन के लिए डीबी की जांच करने के लिए उपयोग किया गया एप्लिकेशन, जो वास्तव में कुशल नहीं है। मैंने query notification, sqldependency, service broker पढ़ा, लेकिन फिर मैंने कुछ ऐसा पढ़ा जो कहा कि यदि मेरे पास 100 क्लाइंट हैं तो वे कुशल नहीं हो सकते हैं और मैं अपने एप्लिकेशन पर नोटिफिकेशन पुश करने के लिए क्वेरी नोटिफिकेशन का उपयोग कर रहा हूं।
क्या कोई मुझे यह करने में मदद करेगा कि मुझे क्या करना चाहिए, और मैं इसे कैसे कर सकता हूं (उदाहरण उपलब्ध होने पर वास्तव में सहायक होगा)। अग्रिम में धन्यवाद!मैं क्लाइंट एप्लिकेशन

उत्तर

16

प्रश्न अधिसूचना एक सेवा ब्रोकर सेवा को सीधे धक्का देगी, न कि सीधे आपके आवेदन पर। यह समझने के लिए The Mysterious Notification देखें कि यह कैसे काम करता है। आपका आवेदन डेटाबेस पर WAITFOR(RECEIVE) कथन पोस्ट करके अधिसूचनाओं का इंतजार कर रहा है। जिसका अर्थ है कि 100 में से प्रत्येक ग्राहक एक SQL सर्वर वर्कर थ्रेड पर कब्जा कर रहा है (जो सीमित हैं, max worker threads विकल्प देखें)। मैंने इसे +1000 क्लाइंट्स के साथ उत्पादन में काम किया है (अधिकतम वर्कर थ्रेड विकल्प को बंप करने के बाद) लेकिन मैं के खिलाफ सलाह दूंगा।

मेरी सिफारिश एक एसक्लड पर निर्भरता/क्वेरी नोटिफिकेशन का उपयोग करके परिवर्तन के लिए सेवा निगरानी होगी। यह सेवा उदाहरण के लिए डब्ल्यूसीएफ का उपयोग करके, आपके सभी चल रहे ऐप्स पर नोटिफिकेशन पुश करेगी। आप जेनेरिक परिवर्तनों की सदस्यता लेंगे (the table Foo was changed), विशिष्ट लोगों के लिए नहीं (the row x in table Foo was inserted)।

एक सामान्य नियम के रूप में SqlDependency/क्वेरी अधिसूचनाएं केवल आपको सूचित कर सकती हैं कि डेटा बदल गया है, लेकिन यह नया डेटा धक्का नहीं देगा। अधिसूचित होने के बाद आवेदन को फिर से प्रश्नों को चलाकर अपने स्थानीय डेटासेट को रीफ्रेश करना होगा।

3

SqlDependency कक्षा का उपयोग करके सावधान रहें - इसमें problems मेमोरी लीक के साथ है। होवर, आप SqlDependency क्लास - SqlDependencyEx के ओपन सोर्स प्राप्ति का उपयोग कर सकते हैं। यह टेबल परिवर्तनों के बारे में घटनाओं को प्राप्त करने के लिए डेटाबेस ट्रिगर और मूल सेवा ब्रोकर अधिसूचना का उपयोग करता है।

int changesReceived = 0; 
using (SqlDependencyEx sqlDependency = new SqlDependencyEx(
      TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME)) 
{ 
    sqlDependency.TableChanged += (o, e) => changesReceived++; 
    sqlDependency.Start(); 

    // Make table changes. 
    MakeTableInsertDeleteChanges(changesCount); 

    // Wait a little bit to receive all changes. 
    Thread.Sleep(1000); 
} 

Assert.AreEqual(changesCount, changesReceived); 

SqlDependecyEx के साथ आप सिर्फ अद्यतन नजर रखने के लिए, हटाएँ और सम्मिलित करें परहेज सक्षम हैं: यह एक प्रयोग उदाहरण है। उम्मीद है की यह मदद करेगा।

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