Microsoft SqlD निर्भरता वर्ग का एक विशिष्ट व्यवहार है। भले ही आप SqlDependency.Stop() विधि को कॉल करें, SqlCommand और SqlConnection को छोड़ दें - यह अभी भी डेटाबेस में वार्तालाप समूह (sys.conversation_groups) और वार्तालाप समापन बिंदु (sys.conversation_endpoints) रखता है। ऐसा लगता है कि SQL सर्वर प्रत्येक वार्तालाप समापन बिंदु को लोड करता है और सभी अनुमत स्मृति का उपयोग करता है। यहां परीक्षण जो इसे साबित करते हैं। इसलिए, सभी अप्रयुक्त वार्तालाप समापन बिंदुओं को साफ़ करने के लिए और सभी कब्जे वाली स्मृति को मुक्त करने के लिए आपको अपने डेटाबेस के लिए यह SQL कोड प्रारंभ करना होगा:
DECLARE @ConvHandle uniqueidentifier
DECLARE Conv CURSOR FOR
SELECT CEP.conversation_handle FROM sys.conversation_endpoints CEP
WHERE CEP.state = 'DI' or CEP.state = 'CD'
OPEN Conv;
FETCH NEXT FROM Conv INTO @ConvHandle;
WHILE (@@FETCH_STATUS = 0) BEGIN
END CONVERSATION @ConvHandle WITH CLEANUP;
FETCH NEXT FROM Conv INTO @ConvHandle;
END
CLOSE Conv;
DEALLOCATE Conv;
साथ ही, SqlD निर्भरता आपको तालिका के सभी परिवर्तनों को प्राप्त करने का अवसर नहीं देती है। इसलिए, आपको SqlD निर्भरता पुनर्सदस्यता के दौरान परिवर्तनों के बारे में सूचना प्राप्त नहीं होती है।
इन सभी समस्याओं से बचने के लिए मैंने एसक्लडपेंडेंसी क्लास का एक और ओपन सोर्स अहसास इस्तेमाल किया - एसक्लडपेंडेंसीएक्स . यह तालिका के परिवर्तनों के बारे में घटनाओं को प्राप्त करने के लिए डेटाबेस ट्रिगर और मूल सेवा ब्रोकर अधिसूचना का उपयोग करता है। यह एक उपयोग उदाहरण है:
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);
आशा है कि यह मदद करता है।