SQL Server の SqlDependency オブジェクトによって引き起こされるメモリ リークへの対処
SQL Server データの変更を監視するために重要な SqlDependency オブジェクトはメモリに蓄積され、サーバーのパフォーマンスに悪影響を与える可能性があります。 この記事では、これらの期限切れのオブジェクトを効果的に削除する方法について詳しく説明します。
問題を理解する
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>
このスクリプトは、切断またはキャンセルされた状態の会話エンドポイントを対象としています。
代替アプローチ: SqlDependencyEx
機能を向上させ、標準の SqlDependency クラスに固有の潜在的な問題を回避するには、オープンソースの代替手段である SqlDependencyEx の使用を検討してください。このソリューションは、データベース トリガーとネイティブの Service Broker 通知を活用します。
SqlDependencyEx を使用した例
これは 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 modifications. MakeTableInsertDeleteChanges(changesCount); // Allow time for change detection. Thread.Sleep(1000); } Assert.AreEqual(changesCount, changesReceived);</code>
これは、SqlDependencyEx を使用したリアルタイムの変更通知を示しています。
以上がSQL Server メモリから期限切れの SqlDependency オブジェクトをクリーンアップする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。