2

最新の安定した MySql Connector/NET 6.5.4.0 を使用しています。

MySQL データベースへの接続を開きます。C# コードでは、Connection.StateプロパティはOpenです。私はいくつかの魔法のようなことをします。それをしている間、接続サーバー側を殺します。ただし、コードでは State はまだOpenです。

データベース クラスのインスタンスをセッションごとに静的変数 (Dictionary) に保存しているため、この問題に遭遇しました。ユーザーがリクエストを行うと、データベース クラスがこの変数から取得され、クエリが実行されます。ただし、接続がサーバー側で閉じられた場合 (sysadmin によって強制終了され、待機タイムアウトが経過した場合)、状態は更新されません。

この問題の回避策はありますか? 私の同僚はすでにバグレポートを提出しています (http://bugs.mysql.com/bug.php?id=64991)。

実行前に閉じて開くと、パフォーマンスに非常に悪いため、オプションはありません。

4

2 に答える 2

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);
}
于 2012-04-18T12:06:01.190 に答える
0

接続にはシングルトン パターンを使用することをお勧めします。そのため、開いている接続が常に 1 つだけであることを確認でき、管理する必要があるのはこの 1 つだけです。

于 2012-04-18T09:48:03.967 に答える