我正在使用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;
}
问题:
using (var db = new myDbContext()) { }
)会导致连接池?答案 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。