ホームページ >データベース >mysql チュートリアル >SQL Server でのメモリ リークを回避するために SqlDependency オブジェクトを効率的に管理するにはどうすればよいですか?
メモリ リークを防ぐために SQL Server の SqlDependency オブジェクト管理を最適化する
質問: SQL Server でのメモリの枯渇を防ぐために SqlDependency
オブジェクトを効果的に管理するにはどうすればよいですか?
答え:
Microsoft の SqlDependency
実装は、大量のメモリ消費につながる可能性のある動作を示します。SqlDependency.Stop()
を呼び出し、SqlCommand
と SqlConnection
を解放した後でも、データベースは会話グループ (sys.conversation_groups
) とエンドポイント (sys.conversation_endpoints
)。 SQL Server はすべてのエンドポイントをロードしているようで、メモリの問題が発生する可能性があります。
これを解決するには、データベースで次の 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
には、特に再サブスクリプション中にすべてのテーブル変更を確実にキャプチャする際に制限があります。
推奨される代替案: 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 detection Thread.Sleep(1000); } Assert.AreEqual(changesCount, changesReceived);</code>
SqlDependencyEx
は、標準の SqlDependency
と比較して信頼性、効率、メモリ管理が向上し、正確な変更追跡を保証し、メモリの問題を防ぎます。
以上がSQL Server でのメモリ リークを回避するために SqlDependency オブジェクトを効率的に管理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。