我正在使用最新的稳定MySql Connector / NET 6.5.4.0。
我打开了与MySQL数据库的连接。在C#代码中,Connection.State
属性为Open
。
我做了一些魔术,当我这样做时,我杀了连接服务器端。但是,在代码中,State仍然是Open
。
我遇到了这个问题,因为我在每个会话(Dictionary)的静态变量中保存了我的数据库类的实例。 如果用户执行了请求,则会从此变量中提取数据库类,并向其触发查询。 但是,如果连接关闭服务器端(由de sysadmin杀死,等待超时已过),则状态不会更新。
这个问题有解决方法吗?我的同事已经提交了一份错误报告(http://bugs.mysql.com/bug.php?id=64991)。
执行前关闭并打开,对性能非常不利,所以没有选项。
答案 0 :(得分:1)
根据您的评论,暂且不谈设计问题(应该真正汇集):
在这种情况下关闭连接池,我将查看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);
}
答案 1 :(得分:0)
我建议你使用单例模式进行连接。因此,您可以确保始终只打开一个连接,您只需要管理这个连接。