基本上我将某个数据集存储在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
);
}
答案 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,以便它可以在需要时进行清理(而不是等待垃圾回收),对于连接,清理意味着终止数据库连接。
所以,是的,在使用范围之外,将没有与数据库的连接。