Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这样做会保持mysql连接打开吗?_C#_Mysql_Caching - Fatal编程技术网

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

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

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

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