SQL Serverに接続するプログラムのDBコネクションリークを確認する方法

この記事は公開から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();
        }
    }
}

file

SQL実行結果

file

プロセス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();
        }
    }
}

file

SQL実行結果

file

プロセスID14632には使われなくなった5個の接続が存在しているため、DBコネクションがリークしていることが確認できます。

ちなみにコネクションプールを有効にしている場合は、全ての接続をクローズしてもコネクションプールによってDBとのコネクションが維持されることに注意が必要です。

参考ウェブサイトなど

以上です。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする