2012-04-18 40 views
2

私は、最新の安定したMySql Connector/NET 6.5.4.0を使用しています。接続状態MySql Connector/NET

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

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

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

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

+0

あなたは接続を見ましたか? falseの場合、接続は閉じられます。 http://dev.mysql.com/doc/refman/5.0/en/connector-net-ref-mysqlclient.html#connector-net-ref-mysqlclient-mysqlconnection-pingまた、次のStateChangeイベントに登録することもできます。何が起こっているかを確認する接続。一般的なアドバイスとして、接続を静的なメンバーとしてキャッシュしないでください。接続プーリングが有効になっている限り、接続のインスタンスを保持することで意味のあるパフォーマンスの向上は見られません。さらに、エロルが発生した場合はどうなりますか? – dash

+0

この場合、接続プーリングはオフになっています。Pingメソッドを調べます。接続が閉じていると、「コマンド実行中に致命的なエラーが発生しました」というメッセージが表示されます。 –

+0

Ping()メソッドは機能しますが、多くの時間がかかります(呼び出しごとに0.020秒)。 StateChangeイベントが遅すぎます(executeリーダーを呼び出すとき)。 –

答えて

0

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

+0

この場合、すべてのユーザーに対して1つの接続が必要ではなく、ユーザーごとに1つの接続が必要です。 –

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); 
} 
+0

'Ping'メソッドには多くの時間がかかります。すべてのコマンドの前にpingを実行しなければならない場合は、大きなパフォーマンス問題です。 –

+0

pingを実行しないとどうなりますか?それでも例外はスローされ、残りのロジックが引き継がれます。 – yamen

+0

はい私はこれを行うことができますが、それはまだ私の意見では不合理な回避策です。 –

関連する問題