0

Essential.LoggingのSQLロガーを使用しています。ここでライブラリのソースを見て、(最後に)見ました

SQLにログインするたびに:

using (var connection = DbProviderFactoryExtensions.CreateConnection(dbFactory, connectionSettings.ConnectionString))
{
    using (var command = DbProviderFactoryExtensions.CreateCommand(dbFactory, CommandText, connection))
    {
        command.Parameters.Add(DbProviderFactoryExtensions.CreateParameter(dbFactory, "@ApplicationName", ApplicationName != null ? (object)ApplicationName : DBNull.Value));
        // ..snip..
        command.Parameters.Add(DbProviderFactoryExtensions.CreateParameter(dbFactory, "@Data", dataString != null ? (object)dataString : DBNull.Value));

        connection.Open(); // <====
        command.ExecuteNonQuery();
    }
}

usingステートメントのすぐ上にあるヘルパー関数は次のとおりです。

public static DbConnection CreateConnection(DbProviderFactory dbFactory, string connectionString)
{
    if (dbFactory == null) throw new ArgumentNullException("dbFactory");

    var connection = dbFactory.CreateConnection();
    connection.ConnectionString = connectionString;
    return connection;
}

質問:

  1. それを行うたびにSQLサーバーへの接続を開いていますか(そして閉じていますか)?SQLサーバーへの接続をプールする方が効率的だと思いますよね?
  2. これをEntityFramework5.0(を使用using (var db = new myDbContext()) { })に置き換えると、接続プールが発生しますか?
4

2 に答える 2

3

それを行うたびにSQLサーバーへの接続を開いていますか(そして閉じていますか)?SQLサーバーへの接続をプールする方が効率的だと思いますよね?

はい。そして、いいえ。Close()を介して呼び出しDispose()ていますが、プールを許可しないプロパティを接続文字列に設定していないと仮定すると、実際にはバックグラウンドで接続をプールしています。これには何もしません。できるだけ遅く開いて、できるだけ早く閉じて、ADO.NETに任せてください。

これをEntityFramework5.0(using(var db = new myDbContext()){})に置き換えると、接続プールが発生しますか?

DbContextは、バックグラウンドで通常のADO.NETを使用するため、プーリングも使用します。生成されるコードは、通常、上記のアドバイスに従います。できるだけ遅く開き、できるだけ早く閉じます。ADO.NETにプーリングを処理させます。

于 2012-12-28T05:10:51.433 に答える
2

アンドリューのコメントを裏付ける情報として:

接続プールを無効にしない限り(接続文字列にPooling = Falseを追加して)、ADO.NETは接続をプールします。接続文字列に従って接続プールを分離します。指定された接続文字列のプールが存在する場合は、それを再利用します。それ以外の場合は、新しい接続を作成します。

デフォルトの最大接続プールサイズは100です。ただし、接続文字列の関連属性(最小プールサイズ、最大プールサイズなど)を設定することで、プールの動作を変更できます。

接続プールの仕組みについては関連するmsdnの記事を、使用法の詳細についてはこちらを参照してください。

于 2012-12-28T11:42:55.947 に答える