【问题标题】:Can I rely on the using statement to close my MySQL connections?我可以依靠 using 语句来关闭我的 MySQL 连接吗?
【发布时间】:2011-04-12 14:57:47
【问题描述】:

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

【问题讨论】:

标签: asp.net mysql


【解决方案1】:

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

从打开到关闭,使用连接对象的 Close 方法或 Dispose 方法。

这告诉我您可以通过 Dispose 方法关闭连接,因此您只需要一个 using 块。

【讨论】:

    【解决方案2】:
    【解决方案3】:

    是的,绝对的。

    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 代替 or as well as,那么考虑上面更冗长的语法,并在 finally 中添加方法。

    【讨论】:

      猜你喜欢
      • 2010-10-09
      • 2012-01-10
      • 1970-01-01
      • 2016-01-10
      • 2012-12-20
      • 1970-01-01
      • 2018-01-20
      • 2020-05-06
      • 2011-12-18
      相关资源
      最近更新 更多