-2

基本上我将某个数据集存储在 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
    );
}
4

3 回答 3

2

使用声明将遵守以下内容:

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

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

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

// Connection Doesn't Exists

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

// Connection Doesn't Exists.

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

希望这能回答你的问题。Microsoft 的开发人员网络对此也有详细的介绍。

于 2013-06-18T18:54:16.330 回答
1

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

于 2013-06-18T18:52:03.530 回答
1

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

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

于 2013-06-18T18:57:02.983 回答