ホームページ >データベース >mysql チュートリアル >期限切れの SqlDependency オブジェクトによって引き起こされる SQL Server のメモリ リークを解決する方法
問題:
SQL Server データベースの変更監視に SqlDependency
クラスを利用するアプリケーションでは、メモリ リークが発生する可能性があります。 期限切れの SqlDependency
オブジェクトがメモリに蓄積され、システム リソースを使い果たす可能性があります。
根本原因:
SqlDependency
はサーバー接続を確立し、テーブル通知を登録します。 依存関係の削除やリソースの解放 (SqlCommand
、SqlConnection
) の後でも、関連する会話グループとエンドポイントはデータベースに残り、メモリを消費します。
解決策: データベースのクリーンアップ
期限切れの SqlDependency
オブジェクトによって占有されていたメモリを再利用するには、影響を受けるデータベース内で次の 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>
SqlDependency の制限:
メモリ管理以外にも、SqlDependency
には固有の制限があります。
代替: SqlDependencyEx ライブラリ
信頼性の向上と包括的な変更追跡については、オープンソースの SqlDependencyEx
ライブラリを検討してください。 データベース トリガーと Service Broker を使用して、より堅牢な通知を実現します。
<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 notification. Thread.Sleep(1000); } Assert.AreEqual(changesCount, changesReceived);</code>
以上が期限切れの SqlDependency オブジェクトによって引き起こされる SQL Server のメモリ リークを解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。