c# - 当我在c#中处理连接时,Mysql是否在6.3.6中关闭连接(Mysqlconnection)

标签 c# mysql

我认为当人们考虑数据库连接时,大多数时候他们谈论的是来自 System.Data 命名空间的 Sqlconnection。

上次在论坛上我读到,即使你在 MySQL 中使用 (),你也需要调用 conn.close();

不确定。对于 MySQL,我不确定。我有一些连接到 MySQL 的 C# 代码。

这段代码打开了一些他们从未关闭过的连接。我想检查代码。我如何验证连接是否已关闭。

我的意思首先是如何验证 using() 自动关闭 mysql 连接。 其次,我如何调试仍未关闭连接的代码。

有人有好的方法知道连接在哪里打开和没有关闭吗。

  MySqlConnection cnn = new MySqlConnection(Globals.CONNSTRING);
            cnn.Open();


            using (cnn)
{
}

我已经添加了这个示例代码,想知道是否有人可以告诉我这是否会自动关闭连接。

最佳答案

MySql Connector for Dot Net 的源代码可从 MySql Site 获得。 .如果您下载它们并查看 MySqlConnection 的 Dispose 方法,您会看到:

protected override void Dispose(bool disposing)
{
  if (State == ConnectionState.Open)
    Close();
  base.Dispose(disposing);
}

但我必须指出,这是版本 6.5.6 的来源。我找不到 6.3.6 版的源代码。但是,以前的版本 (6.1.6) 具有相同的代码。

看着你的代码,我发现它有点奇怪和危险。
通常常见的使用模式如下

using(MySqlConnection cnn = new MySqlConnection(Globals.CONNSTRING))
{
    cnn.Open();
    ......
}

这样,如果Open fais,连接就会被释放。而在您的代码中,这不会发生,因为您从未输入 using 语句。

最后,这是您上面的代码生成的 IL 代码(仅添加了一个 FAKE 和无效的连接字符串)

IL_0000:  ldstr       "test"
IL_0005:  newobj      MySql.Data.MySqlClient.MySqlConnection..ctor
IL_000A:  stloc.0     // cnn
IL_000B:  ldloc.0     // cnn
IL_000C:  callvirt    System.Data.Common.DbConnection.Open
IL_0011:  ldloc.0     // cnn
IL_0012:  stloc.1     // CS$3$0000
IL_0013:  leave.s     IL_001F
IL_0015:  ldloc.1     // CS$3$0000
IL_0016:  brfalse.s   IL_001E
IL_0018:  ldloc.1     // CS$3$0000
IL_0019:  callvirt    System.IDisposable.Dispose
IL_001E:  endfinally  

那就不足为奇了。 Connection 关闭并释放

关于c# - 当我在c#中处理连接时,Mysql是否在6.3.6中关闭连接(Mysqlconnection),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16686665/

相关文章:

c# - WCF 作为应用程序工作,而不是作为服务

c# - HttpWebRequest 在第二次调用 Web 服务器时超时

c# - 奇怪的光线追踪伪影 - 错误的彩色像素

mysql - 在 join 语句上使用 like 的最有效方法是什么?

mysql - rake 中止!未初始化的常量 Mysql2

php - 在使用 Paginator 的查询中组合聚合字段(group by)和排序(order by)时,Doctrine 会生成不正确的 SQL

c# - 如何使用 Linq 在列表中打印列表

c# - 通用的类似 BitConverter 的方法?

mysql - 使用 Amazon RDS 的 DIY 分片策略

php - 在 zend 框架中构建搜索查询