この記事は公開から3年以上経過しています。
Microsoft® SQL Serverに接続するプログラム開発などで、DBコネクションがリークしているかどうかをSQLで確認する方法。
対応
SQL Server端末、またはクライアント端末でSQLクライアントを用いてSQL Serverに接続を行いsys.dm_exec_connections
テーブルとsys.dm_exec_sessions
テーブルからコネクション/セッション状態を取得する。
サンプルSQLソースコード
select ssn.session_id,
host_name,
host_process_id,
program_name,
db_name(database_id) as db_name
from sys.dm_exec_connections as con
inner join sys.dm_exec_sessions as ssn on con.session_id = ssn.session_id
where is_user_process = 1
order by host_name,
host_process_id,
session_id
検証
DBコネクションがリークしていないとき
テストプログラムコード(C#)
using System;
using System.Data.SqlClient;
namespace SQLConTest210421
{
internal class Program
{
private static void Main(string[] args)
{
// 接続→切断で5回接続を試行
for (var i = 1; i <= 5; ++i)
{
// 本例ではわかりやすいようにコネクションプールを無効に設定
var con = new SqlConnection("Server=localhost;Database=TEST_DB;Integrated Security=true;pooling=false;");
con.Open();
Console.WriteLine($"{i}");
con.Close();
}
Console.ReadKey();
}
}
}
SQL実行結果
プロセスID12836
が存在しないことから、DB接続がリークしていないことが確認できます。
DBコネクションがリークしているとき
テストプログラムコード(C#)
using System;
using System.Data.SqlClient;
namespace SQLConTest210421
{
internal class Program
{
private static void Main(string[] args)
{
// 接続後に切断せずに5回接続を試行
for (var i = 1; i <= 5; ++i)
{
// 本例ではわかりやすいようにコネクションプールを無効に設定
var con = new SqlConnection("Server=localhost;Database=TEST_DB;Integrated Security=true;pooling=false;");
con.Open();
Console.WriteLine($"{i}");
//con.Close();
}
Console.ReadKey();
}
}
}
SQL実行結果
プロセスID14632
には使われなくなった5個の接続が存在しているため、DBコネクションがリークしていることが確認できます。
ちなみにコネクションプールを有効にしている場合は、全ての接続をクローズしてもコネクションプールによってDBとのコネクションが維持されることに注意が必要です。
参考ウェブサイトなど
-
Microsoft Docs
sys.dm_exec_connections (Transact-SQL) -
Microsoft Docs
sys.dm_exec_sessions (Transact-SQL)
以上です。