期限切れの SqlDependency オブジェクトを SQL Server メモリから消去しています
SQL Server で SqlDependency オブジェクトを使用するには、期限切れの依存関係によるメモリ リークを防ぐために慎重な管理が必要です。この記事では、これに対処するための効果的な戦略について詳しく説明します。
SqlDependency のクリーンアップ制限について理解する
SqlDependency は期限切れの接続を自動的に削除しません。 Stop()
が呼び出され、関連付けられた SqlCommand
および SqlConnection
オブジェクトが解放された後でも、会話グループとエンドポイントはデータベースに残ります。 この蓄積により、大量のサーバー メモリが消費されます。
手動クリーンアップ用の SQL クエリ
未使用の会話エンドポイントを手動でクリアしてメモリを解放するには、データベースで次の SQL コードを実行します。
<code class="language-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;</code>
代替: SqlDependencyEx クラス
オープンソースの SqlDependencyEx
クラスの使用を検討してください。 データベース トリガーとテーブル変更イベントのネイティブ Service Broker 通知を活用し、いくつかの利点を提供します。
SqlDependencyEx の使用例
<code class="language-csharp">int changesReceived = 0; using (SqlDependencyEx sqlDependency = new SqlDependencyEx( TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME)) { sqlDependency.TableChanged += (o, e) => changesReceived++; sqlDependency.Start(); // Simulate table changes. MakeTableInsertDeleteChanges(changesCount); // Allow time for change processing. Thread.Sleep(1000); } Assert.AreEqual(changesCount, changesReceived);</code>
これらのメソッドを採用すると、SqlDependency オブジェクトのメモリ管理が効率的になり、SQL Server アプリケーションのパフォーマンスが最適化されます。
以上が期限切れの SqlDependency オブジェクトを SQL Server メモリから効果的に削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。