连接状态 MySql 连接器/NET
本文关键字:NET 连接器 MySql 状态 连接 | 更新日期: 2023-09-27 18:31:25
我正在使用最新的稳定版MySql Connector/NET 6.5.4.0。
我打开了与 MySQL 数据库的连接。在 C# 代码中,Connection.State
属性为 Open
。我做了一些神奇的stuf,当我这样做的时候,我杀死了连接服务器端。但是,在代码中,状态仍然是Open
。
我遇到了这个问题,因为我将数据库类的实例保存在每个会话的静态变量(字典)中。如果用户执行请求,则会从此变量中提取数据库类,并向其触发查询。但是,如果连接关闭服务器端(由 de sysadmin 杀死,等待超时已过),则状态不会更新。
有解决此问题的方法吗?我的同事 allready 为它提交了一份错误报告(http://bugs.mysql.com/bug.php?id=64991)。
在执行之前关闭和打开,对性能非常不利,所以没有选择。
抛开设计问题(真的应该汇集),根据您的评论:
在这种情况下,连接池已关闭,我将研究 Ping 方法。如果此连接已关闭,则会出现"致命错误" 命令执行期间遇到'
如果 ping 失败,有什么理由不重新创建连接吗?
private static MySqlConnection conn;
private static int maxRetries;
private static void connect()
{
conn = <connect code>;
}
private static MySqlConection GetConnectionRetry(int count)
{
if (conn != null && conn.State == Open)
{
try
{
conn.Ping();
return conn;
}
catch (Exception e) // better be specific here
{
if (count <= maxRetries)
{
connect();
return GetConnectionRetry(count + 1);
}
else throw e;
}
}
else
{
connect();
return GetConnectionRetry(count + 1);
}
}
static MySqlConnection GetConnection()
{
return GetConnectionRetry(1);
}
我建议您使用singelton模式进行连接。因此,您可以确保始终只有一个连接处于打开状态,并且只需管理此连接。