【问题标题】:When .NET runtime closes (My)SQL connections from connection pool当 .NET 运行时关闭连接池中的 (My)SQL 连接时
【发布时间】:2014-05-15 09:03:50
【问题描述】:

我最近阅读了有关连接池的文章(msdnmysql documentation)。

连接池的目的是不应该强迫 MySQL 客户端不断地进行连接和断开连接。因此,当连接的用户不再需要连接时,可以在 MySQL 客户端中缓存连接。因此,需要连接到同一个 MySQL 服务器的另一个用户可以稍后重用这个缓存的连接(由 Mikael Ronstrom 提供)。

这意味着:

  • 我连接到 MySQL 服务器
  • 执行一些查询
  • 调用 MySqlConnection.Close()
  • 此时连接没有关闭,它保存在客户端(应用程序)的连接池中。如果我再次执行 MySqlConnection.Open(connection string),将从应用程序的连接池中创建/获取连接(连接轮询仅返回 MySqlConnection 的实例)。

我用这段代码测试过:

 MySqlConnection conn = new MySqlConnection("server=localhost;uid=user;pwd=pass;database=dbname;Pooling=true");

 try
 {
   conn.Open();
   Console.WriteLine("Connected to sql server");
 }
 catch (MySqlException e)
 {
   Console.WriteLine("Error connecting to sql server ["+e.Message+"]");
 }

 MySqlCommand cmd = new MySqlCommand("select * from table1 where id = 1", conn);
 MySqlDataReader reader = cmd.ExecuteReader();

 while (reader.Read())
 {
   string a = reader.GetString(0);
 }
 reader.Close();

 try
 {
   conn.Close();
 }
 catch (MySqlException e) {}

 // I connected to MySQL server via terminal and executed 'show full processlist'
 // connection was still present
 // If I add MySqlConnection.ClearAllPools(); connection was closed (everything as it should)

.NET 运行时调用连接器 MySqlConnection.ClearAllPools();或 MySqlConnection.ClearPool() 静态方法?这些方法实际上关闭了与 MySQL 服务器的连接。如果 .NET 应用程序崩溃,MySQL 连接会在 wait_timeout 过后关闭吗?我是否应该在应用程序执行结束时调用 ClearAllPool()(最后一行)。

【问题讨论】:

  • 作为一般规则,始终使用“使用”..它将处理您的连接并关闭它
  • @apomene 我同意,谢谢。虽然在我的情况下直接或使用 using 自动调用 conn.Dispose() 没有任何效果。

标签: c# mysql .net connector-net


【解决方案1】:

来自您指定的 MSDN 链接

如果指定的MinPoolSize大于零,则连接池不会被销毁,直到AppDomain被卸载并且进程结束。

进一步

当发生致命错误(例如故障转移)时,池会自动清除。

因此,当应用程序退出时,连接将被清除。

您应该能够通过建立连接来测试这一点,在使用close() 方法后验证它是否仍然打开,然后导致应用程序崩溃。

【讨论】:

  • 通过销毁这是否意味着 ClearAllPools() 被实际调用或 .NET 只是终止了该进程打开的 TCP 连接。
  • @broadband 没有指定确切的底层过程,但文档中明确指出The pool is automatically cleared when a fatal error occurs, such as a failover.,因此它确实清除了底层结构并关闭了连接。我在第一次阅读时错过了这个,已经更新了答案。
猜你喜欢
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多