这样做会保持mysql连接打开吗?

时间:2013-06-18 18:48:04

标签: c# mysql caching

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

3 个答案:

答案 0 :(得分:2)

The Using Statement will adhere to the following:

  

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

     

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

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

// Connection Doesn't Exists

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

// Connection Doesn't Exists.

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

希望能回答你的问题。微软的开发者网络也有很多细节。

答案 1 :(得分:1)

您的MySqlConnection对象不在using块的范围之外。在using块中,在退出时实现Dispose的对象上调用IDisposable。如果未在IDisposable块中声明,则实现using的对象将不会自动处置。在这种情况下,需要手动调用Dispose来清理资源。

答案 2 :(得分:1)

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

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