2011-04-12 65 views
3

我有一個使用mysql作爲數據庫的ASP.NET網站。我注意到當我顯示完整的進程列表時,有很多連接「正在休眠」。今天我們遇到了一些錯誤:「從池中獲取連接之前已經超時了。」如果進程「睡眠」,那麼它們是否仍然從代碼打開?代碼中的所有MySQL連接均使用語句。我可以依靠使用聲明來正確關閉連接嗎?我可以依靠using語句來關閉我的MySQL連接嗎?

編輯代碼: 我使用這個類來創建我的連接:

public class DbAccess 
{ 
    public static MySqlConnection OpenConnection(string connectionStringName) 
    { 
     string connectionString = ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString; 
     if (string.IsNullOrEmpty(connectionString)) 
     { 
      throw new ArgumentException("Connection string " + connectionStringName + " does not exist."); 
     } 
     MySqlConnection connection = new MySqlConnection(connectionString); 
     connection.Open(); 
     return connection; 
    } 
} 

然後我打電話這樣說:

using (MySqlConnection connection = DbAccess.OpenConnection(connectionString)) 
{ 
    //Code Here 
} 

一些額外的信息:重置MySQL並沒有使錯誤消失,但重置我的應用程序池確實..

+0

你可以顯示數據庫訪問的實際代碼嗎? – sukru 2011-04-12 14:59:36

+0

[在C#中使用MySQLConnection無法正常關閉。](http://stackoverflow.com/questions/5567097/using-mysqlconnection-in-c-does-not-close-properly) – 2011-04-12 15:06:47

回答

1

即使拋出異常,C#使用塊也保證調用對象的.Dispose()方法。這意味着它是安全的,只有您的提供者將使用.Dispose()方法關閉連接。查看documentation for that type,我看到這段摘錄(在第25.2.3.3.5節中):

從Open到Closed,使用Close方法或連接對象的Dispose方法。

這告訴我你可以通過Dispose方法關閉連接,因此using塊應該是你所需要的。

0

是的,絕對。

using (MySqlConnection connection = DbAccess.OpenConnection(connectionString)) 
{ 
    //Code Here 
} 

是完全一樣的

MySqlConnection connection = null 
try 
{ 
    connection = DbAccess.OpenConnection(connectionString) 
    //Code Here 
} 
finally 
{ 
    if (connection is IDisposable) 
     connection.Dispose 
} 

提供的MySqlConnection類實現了IDisposable,那麼它會得到妥善清理。如果你需要調用另一個方法,比如關閉而不是,那麼考慮上面更詳細的語法,並在finally中添加方法。

相關問題