ホームページ >データベース >mysql チュートリアル >SqlDependency を使用するときに SQL Server のメモリ使用量を最適化する方法
SqlDependency を使用した SQL Server のメモリ使用量の最適化
課題:
SQL Server の SqlDependency
クラスを使用すると、メモリ リークが発生することがよくあります。 未使用の SqlDependency
オブジェクトが蓄積すると、リソースの大量消費と潜在的なメモリ枯渇につながり、特に SQL Server Express で顕著です。 これらの古い依存関係を効率的に削除することが、最適なパフォーマンスを維持する鍵となります。
解決策:
SqlDependency.Stop()
で依存関係を停止するだけでは十分ではありません。会話グループとエンドポイントはデータベースに残ります。 これに対処するには、次の 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
標準の SqlDependency
クラスには制限があり、特に再サブスクリプション中にすべてのテーブルの変更を確実に追跡することができません。 より堅牢な代替手段は、データベース トリガーとネイティブの Service Broker 通知を利用するオープンソース ソリューションである SqlDependencyEx
です。 これにより、より信頼性の高い変更通知が提供され、Microsoft の実装に固有のメモリの問題が回避されます。
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 detection. Thread.Sleep(1000); } Assert.AreEqual(changesCount, changesReceived);</code>
このアプローチにより、データ変更のタイムリーな通知が保証され、組み込みの SqlDependency
クラスに関連するメモリの問題が効果的に軽減されます。
以上がSqlDependency を使用するときに SQL Server のメモリ使用量を最適化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。