2012-12-28 33 views
0

我正在使用Essential.Logging的SQL记录器。我看着source of the library here,看到(末)此代码池是否连接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服务器的连接? T'我认为将连接池连接到SQL服务器会更高效,对吧?
  2. 如果我用Entity Framework 5.0(用using (var db = new myDbContext()) { })替换它会导致连接池吗?

回答

3

每次它打开(和关闭)与SQL服务器的连接吗?我认为将连接池连接到SQL服务器会更高效,对吧?

是的。和不。它通过Dispose()调用Close(),但它实际上是在后台为您建立连接,假定您没有在连接字符串中设置任何禁止共享的属性。 你不为此做任何事情;只是尽快开放,尽快关闭,让ADO.NET做到这一点。

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

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

2

作为辅助信息对安德鲁的comment

除非你禁用连接池(通过添加池=假到您的连接字符串),ADO.NET池您的连接。它根据连接字符串分隔连接池。如果给定的连接字符串存在一个池,请重新使用它,否则创建一个新的连接。

默认最大连接池大小为100,但你可以改变通过设置连接字符串的相关属性缓冲池行为 - 闵池大小,最大池大小等

请参阅相关msdn article如何连接池工程和here了解使用细节。