2 回答

TA貢獻(xiàn)1725條經(jīng)驗(yàn) 獲得超8個(gè)贊
Microsoft SqlDependency類有一個(gè)特定的行為。即使您調(diào)用SqlDependency.Stop()方法,釋放SqlCommand和SqlConnection - 它仍然保留數(shù)據(jù)庫中的會(huì)話組(sys.conversation_groups)和會(huì)話端點(diǎn)(sys.conversation_endpoints)??雌饋鞸QL Server加載每個(gè)會(huì)話端點(diǎn)并使用所有允許的內(nèi)存。這里測試證明了這一點(diǎn)。因此,要清除所有未使用的會(huì)話端點(diǎn)并釋放所有占用的內(nèi)存,您必須為數(shù)據(jù)庫啟動(dòng)此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;ENDCLOSE Conv;DEALLOCATE Conv;
此外,SqlDependency不會(huì)讓您有機(jī)會(huì)接收表的所有更改。因此,在SqlDependency重新訂閱期間,您不會(huì)收到有關(guān)更改的通知。
為了避免所有這些問題,我使用了另一個(gè)SqlDependency類的開源實(shí)現(xiàn)--SqlDependencyEx。它使用數(shù)據(jù)庫觸發(fā)器和本機(jī)Service Broker通知來接收有關(guān)表更改的事件。這是一個(gè)用法示例:
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);
希望這可以幫助。
- 2 回答
- 0 關(guān)注
- 850 瀏覽
添加回答
舉報(bào)