2012-12-28 36 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瞭解使用細節。