いろいろ備忘録日記

主に .NET と Python絡みのメモを公開しています。

ADO.NET入門記-004 (コネクションプーリングをする場合としない場合の速度差)


.NETフレームワークに最初から登録されているデータプロバイダは、接続する際デフォルトで
コネクションプーリングがONの状態となります。これを明示的にプーリングしないようにするには
接続文字列に以下のように設定します。(SQL Server及びOracleの場合。その他の場合は調べてません。。)

Pooling=False


で、どれくらい速度に差がでるのかをちょっと調べるサンプルを書きました。
以下のサンプルはコネクションプーリングをする場合としない場合で、それぞれ50接続づつ
接続を作成します。

app.configファイルには、以下の設定がおこなってあるとします。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
    </configSections>
    <connectionStrings>
        <add name="Gsf.Samples.AdoNet.Properties.Settings.WithPooling"
            connectionString="Data Source=localhost\SQLEXPRESS;Initial Catalog=adonet_sample_db;Integrated Security=True;Max Pool Size=50"
            providerName="System.Data.SqlClient" />
        <add name="Gsf.Samples.AdoNet.Properties.Settings.NoPooling"
            connectionString="Data Source=localhost\SQLEXPRESS;Initial Catalog=adonet_sample_db;Integrated Security=True;Pooling=False;Max Pool Size=50"
            providerName="System.Data.SqlClient" />
    </connectionStrings>
</configuration>
using System;
using System.Data.Common;
using System.Diagnostics;

using NUnit.Framework;

using Gsf.Lib.UnitTests;

namespace Gsf.Samples.AdoNet {

    [TestFixture(Description="コネクションプーリングをしない場合のパフォーマンスの違いの確認")]
    public class AdoNetSample005 : TestBase{

        [Test()]
        public void コネクションプーリングをした場合の50接続確立までの時間確認(){

            Stopwatch watch = new Stopwatch();

            watch.Start();
            for(int i = 0; i < 50; i++){
                using(DbConnection conn = DbProviderFactories.GetFactory("System.Data.SqlClient").CreateConnection()) {

                    conn.ConnectionString = Properties.Settings.Default.WithPooling;
                    conn.Open();
                }
            }
            watch.Stop();

            Debug.WriteLine(string.Format("コネクション生成時間(WithPooling):{0}ms", watch.Elapsed.Milliseconds));
        }

        [Test()]
        public void コネクションプーリングをしない場合の50接続確立までの時間確認(){

            Stopwatch watch = new Stopwatch();

            watch.Start();
            for(int i = 0; i < 50; i++) {
                using(DbConnection conn = DbProviderFactories.GetFactory("System.Data.SqlClient").CreateConnection()) {

                    conn.ConnectionString = Properties.Settings.Default.NoPooling;
                    conn.Open();
                }
            }
            watch.Stop();

            Debug.WriteLine(string.Format("コネクション生成時間(NoPooling):{0}ms", watch.Elapsed.Milliseconds));
        }
    }
}

私の環境では、以下のように出力されました。

コネクション生成時間(WithPooling):22ms
コネクション生成時間(NoPooling):334ms

2 passed, 0 failed, 0 skipped, took 3.70 seconds.

環境によって、違いはあると思いますがかなり違う結果になると思います。