我可以依赖using语句来关闭我的MySQL连接吗?

时间:2011-04-12 14:57:48

标签: asp.net mysql

我有一个使用mysql作为数据库的ASP.NET网站。我注意到当我显示完整的进程列表时,有很多连接“正在休眠”。今天我们遇到了一些错误“在从池中获取连接之前已经过了超时时间”。如果进程“正在休眠”,那么它们是否仍然从代码中打开?代码中的所有MySQL连接都在using语句中。我可以依靠using语句来正确关闭连接吗?

编辑代码: 我正在使用这个类创建我的连接:

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并没有消除错误,但重置我的应用程序池确实..

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

使用块的C#保证调用对象的.Dispose()方法,即使抛出异常也是如此。这意味着它是安全的,只有当您的提供者使用.Dispose()方法来关闭连接时。查看documentation for that type,我看到这段摘录(见第25.2.3.3.5节):

  

从Open到Closed,使用Close方法或连接对象的Dispose方法。

这告诉我你可以通过Dispose方法关闭连接,因此你应该只需using块。

答案 2 :(得分: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,那么它将被正确清理。如果你需要调用另一个方法,比如close而不是或者更好,那么考虑上面更详细的语法并在finally中添加方法。