2012-11-26 81 views
0

任何人都可以在下面的代碼中看到連接可能會泄露此日誌記錄到數據庫代碼的任何地方?偶爾會收到錯誤標題,但在運行此應用程序時並不總是如此。我只剩下要嘗試的事情就是包含:SqlConnection.ClearAllPools();};};處置之前。這會有助於還是導致不適當的負載?SqlConnection - 從池中獲取連接之前已經超時的時間段

private void InsertToDb(EventLogDto e, string connectionString) 
    { 
     var cmd = new SqlCommand(); 
     using (var sqlConn = new SqlConnection(connectionString)) 
     { 
      try 
      { 
       // Open the connection. 
       sqlConn.Open(); 

       // Build the SqlCommand object 
       cmd = BuildSqlCommand(e, sqlConn); 

       // Execute the Stored Proc. 
       cmd.ExecuteNonQuery(); 
      } 
      catch (Exception ex) 
      { 
       Logger.Instance.Fatal(ex); 
      } 
      finally 
      { 
       sqlConn.Close(); 
       sqlConn.Dispose(); 
      } 
     } 
    } 

其中BuldSqlCommand(e,sqlConn);是:

private SqlCommand BuildSqlCommand(EventLogDto e, SqlConnection sqlConn) 
    { 
     var cmd = new SqlCommand 
     { 
      CommandText = "dbo.InsertEventLog", 
      CommandType = CommandType.StoredProcedure, 
      Connection = sqlConn 
     }; 

     InsertValue(cmd.Parameters, "@EventId", e.EventId); 
     InsertValue(cmd.Parameters, "@DateCreated", e.EventDate); 
     InsertValue(cmd.Parameters, "@Severity", e.Severity); 
     InsertValue(cmd.Parameters, "@Message", e.Message); 
     InsertValue(cmd.Parameters, "@Source", e.Source); 
     InsertValue(cmd.Parameters, "@TargetSite", e.TargetSite); 
     InsertValue(cmd.Parameters, "@StackTrace", e.StackTrace); 

     return cmd; 
    } 
+1

我認爲'sqlConn.Dispose()'可能會導致問題。由於close()會返回連接池的連接。處置掉了它。 – AssaultingCuccos

+0

您正在創建一個SqlCommand實例,以僅將它扔掉,轉而使用BuildSqlCommand創建的新實例。 – Rob

+0

Logger.instance.Fatal()是做什麼的?它是否以無限遞歸的性質創建SqlConnections? – Rob

回答

1

試試看看是否有幫助。

try { 
    using (var sqlConn = new SqlConnection(myConnectionString)) { 
     using (SqlCommand cmd = sqlConn.CreateCommand()) { 
      sqlConn.Open(); 
      AttachParameters(cmd, e); 
      cmd.ExecuteNonQuery(); 
     } 
    } 
} catch (Exception ex) { 
    Logger.Instance.Fatal(ex); 
} 

如果它仍然發生,我猜它是因爲致命()。

+0

感謝rob - 根據你的上述評論,仔細觀察已寫入的底層框架,看起來致命的調用也被掛鉤到遞歸失敗的數據庫記錄器中。好喊。 – M05Pr1mty

相關問題