C# 这样做会保持mysql连接打开吗?
基本上,我将某个数据集存储在asp.net缓存中。我想知道的是,这样做是否会保持mysql连接打开?即使我在使用“using”语句C# 这样做会保持mysql连接打开吗?,c#,mysql,caching,C#,Mysql,Caching,基本上,我将某个数据集存储在asp.net缓存中。我想知道的是,这样做是否会保持mysql连接打开?即使我在使用“using”语句 String cacheName="MY_QUERY_QACHE"; IEnumerable<DataRow> datarows = (IEnumerable<DataRow>)HttpRuntime.Cache[cacheName]; if(datarows==null){ using (MySqlConnection conn
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
);
}
String cacheName=“MY\u QUERY\u QACHE”;
IEnumerable数据行=(IEnumerable)HttpRuntime.Cache[cacheName];
if(datarows==null){
使用(MySqlConnection conn=newmysqlconnection(“我的连接字符串”)){
conn.Open();
String strSQL=“从我的表格等中选择*”;
MySqlCommand cmd=新的MySqlCommand(strSQL,conn);
MySqlDataAdapter da=新的MySqlDataAdapter();
数据集ds=新数据集();
cmd.Prepare();
da.SelectCommand=cmd;
da.填充(ds);
datarows=ds.Tables[0].AsEnumerable();
康涅狄格州关闭();
}
HttpRuntime.Cache.Add(cacheName,
数据行,
无效的
DateTime.Now.AddDays(1),
System.Web.Caching.Cache.NoSlidingExpiration,
System.Web.Caching.CacheItemPriority.Normal,
无效的
);
}
您的MySqlConnection
对象不存在于使用块的范围之外。在using
块中,对在退出时实现IDisposable
的对象调用Dispose
。如果未使用
块在中声明,则实现IDisposable
的对象将不会自动处置。在这种情况下,需要手动调用Dispose来清理资源。
通常,当您使用IDisposable对象时,应该声明和
在using语句中实例化它。using语句调用
以正确的方式在对象上处置方法,以及(当您使用它时
如前所示),它还会导致对象本身超出范围
只要调用Dispose。在使用块中,对象是
只读,无法修改或重新分配
using语句确保调用Dispose,即使
调用对象上的方法时发生异常。你可以
通过将对象放入try块并
然后在finally块中调用Dispose;事实上,这就是
using语句由编译器翻译。代码示例
前面的代码在编译时扩展为以下代码(注意额外的
使用大括号创建对象的有限范围)
该语句的使用应该确保无论发生什么情况,连接都是关闭的。如上所述,即使出现异常,连接仍将关闭。原因是您的连接不存在,原因如下:
// Connection Doesn't Exists
using(SqlConnection connection = new SqlConnection())
{
// Connection Exists
}
// Connection Doesn't Exists.
从上面的代码可以看出,任何不在这些括号内的内容都将超出范围,这将启动IDisposable
接口,使用方法Dispose
删除资源。如果你没有使用,那么你会让它打开,并负责处理它
希望这能回答你的问题。微软的开发者网络在这方面也有很多细节。当执行离开使用范围时,“使用”的要点是调用处置(清理)。连接对象继承自IDisposable,以便在需要时进行清理(而不是等待垃圾回收),对于连接,清理意味着终止数据库连接
因此,是的,在使用范围之外,将不会有到数据库的连接。我不明白为什么会显式关闭连接。您的dataows是一个独立于connection对象的对象,在该对象中看起来需要正确地处理。是什么让你认为它是开放的?有没有错误或信息让你这么想?第一句话并不意味着第二句话。对象可能不在任何位置的作用域中,但连接可能不关闭。连接已关闭,但它已关闭,因为using
语句将在连接离开作用域时调用Dispose
,并且该方法将关闭连接。如果未使用using
,并且未显式调用Close
或Dispose
,则它可能会在不关闭连接的情况下离开作用域。我已按照您的评论中建议的更正更新了我的答案。谢谢你指出第二句话不是暗示的!还是不对。不是“因为对象实现了IDisposable
。如果类型没有实现IDisposable
,并且如果类型确实实现了IDisposable
,并且您没有在中使用,或者调用Dispose
,则不允许使用。这里的要点是使用
本身调用对象上的Dispose
。