私の職場には、Sql サーバーに直接接続するサードパーティのデスクトップ アプリケーションを使用している営業担当者がおり、ソフトウェアは各ユーザーに数百のスリープ状態の接続を残しています。これらの接続をプログラムでクリアする方法はありますか?
2 に答える
どのバージョンのSQLServerを実行していますか?これを行うためのストアドプロシージャを記述して、sp_whoからのデータを確認し、最後のアクティビティについて推測することができます。このユーザーが最後に何かを送信したときに実行する「LastBatch」列があります。それが1時間以上経過している場合(または任意の間隔)、そのSPIDに対してKILLを実行します。
これは、SQL2005で次のように実行できます。
declare @spid int
, @cmd varchar(200)
declare Mycurs cursor for
select spid
from master..sysprocesses
where status = 'sleeping'
and last_batch > dateadd( s, -1, getdate())
open mycurs
fetch next from mycurs into @spid
while @@fetch_status = 0
begin
select @cmd = 'kill ' + cast(@spid as varchar)
exec(@cmd )
fetch next from mycurs into @spid
end
deallocate MyCurs
しかし、これらのプロセスを手動で強制終了する代わりに、これらを回避する方法はないのでしょうか? 私はプロジェクトで同じ問題を抱えています
この Web アプリケーションでは、Web サービスを使用していくつかの更新を実行しています (つまり、プログラムは Web サービス メソッドを呼び出します。メソッドは接続を開き、更新を行い、connection.close() を使用して接続をコミットし、閉じます)。
sqlserver mgmt studio で sp_who2 を実行すると、アプリの実行中に接続が増加することがわかります。実際には、更新の実行ごとに 1 つの接続の割合で増加します。そして、関係する部分は、100 を超えてから、データベースへの接続を許可しないことです。ユーザーはログインできず、これ以上新しい接続を取得できないため、プログラムは失敗します。
接続が確実に再利用されるようにする方法 - デフォルトの asp.net および Sqlserver 接続プールを使用して、接続プール コードを記述していません。接続が再利用されないのはなぜですか? また、「クローズ」された後に接続が消えないのはなぜですか? これは、Web サービスがトランザクションを処理しているという事実に依存しますか?
どうもありがとう