【问题标题】:Will doing this keep the mysql connection open?这样做会保持mysql连接打开吗?
【发布时间】:2013-06-15 02:53:48
【问题描述】:

基本上我将某个数据集存储在 asp.net 缓存中。我想知道的是,这样做是否会保持 mysql 连接打开?即使我使用的是“使用”语句?

String cacheName="MY_QUERY_QACHE";

IEnumerable<DataRow> datarows = (IEnumerable<DataRow>)HttpRuntime.Cache[cacheName];

if(datarows==null){
    using (MySqlConnection conn = new MySqlConnection("MY CONNECTION STRING")){
        conn.Open();
            String strSQL="SELECT * FROM my_table etc... etc....";

            MySqlCommand cmd = new MySqlCommand(strSQL, conn);
            MySqlDataAdapter da = new MySqlDataAdapter();
            DataSet ds = new DataSet();
            cmd.Prepare();

            da.SelectCommand = cmd;
            da.Fill(ds);

            datarows = ds.Tables[0].AsEnumerable();
        conn.Close();
    }

    HttpRuntime.Cache.Add(cacheName,
        datarows,
        null,
        DateTime.Now.AddDays(1),
        System.Web.Caching.Cache.NoSlidingExpiration,
        System.Web.Caching.CacheItemPriority.Normal,
        null
    );
}

【问题讨论】:

  • 我不明白你为什么要明确关闭你的连接。您的 dataows 是一个独立于连接对象的对象,看起来被正确处理。是什么让你认为它保持开放?是否有错误或信息让您产生这种想法?

标签: c# mysql caching


【解决方案1】:

The Using Statement will adhere to the following:

通常,当您使用 IDisposable 对象时,您应该声明并 在 using 语句中实例化它。 using 语句调用 以正确的方式处理对象上的方法,并且(当你使用它时 如前所示)它还会导致对象本身超出范围 一旦调用 Dispose。在 using 块中,对象是 只读,不能修改或重新分配。

using 语句确保 Dispose 被调用,即使 当您在对象上调用方法时发生异常。你可以 通过将对象放在 try 块中来实现相同的结果,然后 然后在 finally 块中调用 Dispose;事实上,这就是 using 语句由编译器翻译。代码示例 早期在编译时扩展为以下代码(注意额外的 花括号为对象创建有限的范围)

该语句的使用应确保无论发生什么连接都关闭。如前所述,即使出现Exception,连接仍将关闭。原因是您的连接不存在于此:

// Connection Doesn't Exists

using(SqlConnection connection = new SqlConnection())
{
    // Connection Exists
}

// Connection Doesn't Exists.

正如您在上面的代码中看到的那样,任何超出这些括号的内容都将变为 超出范围,这将使用方法 Dispose 启动 IDisposable 接口以删除资源.如果您没有使用 using,那么您将让它保持打开状态并负责处理它。

希望这能回答您的问题。微软的开发者网络对此也有详细的介绍。

【讨论】:

    【解决方案2】:

    “使用”的重点是在执行离开使用范围时调用处置(清理)。连接对象继承自 IDisposable,因此它可以在需要时进行清理(而不是等待垃圾回收),对于连接,清理意味着终止数据库连接。

    所以,是的,在 using 范围之外,将没有与数据库的连接。

    【讨论】:

      【解决方案3】:

      您的MySqlConnection 对象不存在于using 块的范围之外。在using 块内,Dispose 在退出时实现IDisposable 的对象上被调用。如果没有在using 块中声明,实现IDisposable 的对象将不会自动释放。在这种情况下,需要手动调用Dispose 来清理资源。

      【讨论】:

      • 第一个语句并不意味着第二个。一个对象可能不在任何地方的范围内,但连接不会关闭。连接已关闭,但它已关闭,因为using 语句将在离开范围时在连接上调用Dispose,并且该方法将关闭连接。如果没有使用using,并且没有明确调用CloseDispose,它可能会在不关闭连接的情况下离开作用域。
      • 我已按照您评论中的建议更新了我的答案并进行了更正。感谢您指出第二个陈述不是隐含的!
      • 仍然不正确。这不是“因为对象实现了IDisposable。如果该类型没有实现IDisposable,并且如果该类型确实实现了IDisposable 和您没有在 using 中拥有它或调用 Dispose 它不会被释放。这里的重点是 using 本身在对象上调用 Dispose
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 2014-07-05
      相关资源
      最近更新 更多