此代码池是否与SQL连接?

时间:2012-12-28 05:02:25

标签: sql-server entity-framework system.data

我正在使用Essential.Logging的SQL记录器。我查看source of the library here并看到(最后)

每次您想要登录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. 如果我用Entity Framework 5.0替换它(带有using (var db = new myDbContext()) { })会导致连接池?

2 个答案:

答案 0 :(得分:3)

  

它每次打开(并关闭)与SQL服务器的连接吗?我认为将连接汇集到SQL服务器会更有效,对吗?

是。和不。它通过Close()调用Dispose(),但它实际上是在后台为您连接连接,假设您没有在连接字符串中设置任何禁止池的属性。 你没有为此做任何事情; 只是尽可能地打开,并尽快关闭,让ADO.NET做它的事情。

  

如果我用Entity Framework 5.0替换它(使用using(var db = new myDbContext()){})会导致连接池?

DbContext也使用池化,因为它在幕后使用常规的ADO.NET。它生成的代码通常遵循我上面给出的建议:尽可能晚地打开,并尽早关闭 - 让ADO.NET处理池化。

答案 1 :(得分:2)

作为Andrew comment的支持信息:

除非您禁用连接池(通过在连接字符串中添加 Pooling = False ),否则ADO.NET会对您的连接进行池化。它根据连接字符串分隔连接池。如果存在给定连接字符串的池,则重新使用它,否则创建新连接。

默认最大连接池大小为100.但您可以通过设置连接字符串的相关属性来更改池行为 - 最小池大小,最大池大小等

有关连接池的工作原理,请参阅相关msdn article,有关使用详情,请参阅here