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. 如果我将其替换为 Entity Framework 5.0(带有 a using (var db = new myDbContext()) { })会导致连接池吗?
4

2 回答 2

3

是否每次都打开(和关闭)与 SQL 服务器的连接?我认为汇集到 SQL 服务器的连接会更有效,对吧?

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

如果我用 Entity Framework 5.0 替换它(使用 (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 回答