连接状态MySql Connector / NET

时间:2012-04-18 09:39:53

标签: c# mysql database-connection mysql-connector

我正在使用最新的稳定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)。

执行前关闭并打开,对性能非常不利,所以没有选项。

2 个答案:

答案 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)

我建议你使用单例模式进行连接。因此,您可以确保始终只打开一个连接,您只需要管理这个连接。