SQL Server のパフォーマンスを最適化するための SqlDependency 接続の管理
SQL Server で SqlDependency
オブジェクトを非効率的に管理すると、メモリ リークやパフォーマンスのボトルネックが発生する可能性があります。 この記事では、イベント処理後にこれらのリソースを効果的にクリーンアップする戦略について詳しく説明します。
問題: リソースの蓄積
SqlDependency
を使用すると、データベース内に会話グループとエンドポイントが作成されます。 これらのリソースは時間の経過とともに蓄積され、特に SQL Server Express エディションではメモリを使い果たす可能性があります。
データベース クリーンアップ ソリューション
次の 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
は、次の拡張機能を提供します。
<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>
データベースのクリーンアップ手順を採用するか、SqlDependencyEx
に移行することで、SqlDependency
リソースを効果的に管理し、メモリの問題を防ぎ、SQL Server のパフォーマンスを最適化できます。
以上がSQL Server で古い SqlDependency 接続を効率的に削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。