2009-10-13 10 views
8

JDBCを使用してデータベースサーバーに接続しています。 接続はワイヤレスネットワークを介して行われ、時には厄介なことがあります。 接続が失われた瞬間、アプリケーションを閉じて再起動する必要があります。自動再接続によるJDBC接続

誰かが最後のクエリを自動的に再接続して再実行するために何らかのラッパーを書くことができるコードの例がありますか?これは多くの面倒を節約します。

私はそれがどのように実装されるべきかわかりません。 おそらくすでに利用可能なものがありますか?

答えて

1

接続プールでこれを処理させると、多くのユーザーが接続を検証できます。したがってtestOnBorrowパラメータを持つDBPCは、すべての接続が使用される前にサニティチェックを強制します。このパラメータのデフォルト値はtrueです。効果を得るにはnull以外の文字列に設定する必要があります。validationQueryが必要です。だからvalidationQueryをセットしてください! documentationをチェックしてください。

1

OracleのUniversal Connection Pool(UCP)ライブラリを参照してください。これらは完全にJDBC 4.0準拠で、接続が有効かどうかを確認するためにisValid()呼び出しを実装します。 falseで再接続した場合は、このチェックを行うのが簡単です。その後、クエリを実行します。私はあなたが接続プールについて質問していない知っているが、これはあなたが二重に役立つよう

Oracle UCP Download Page

、あなたはおそらくとにかく1を使用する必要があります。

+0

OPは** Firebird **を使用していますが、なぜ彼はオラクルのドライバを使用しますか?次に、コードに接続検証ロジックを実装しないで、このチェックを実装するプールを使用します(これにはJDBC 4.0ドライバを使用する必要はありません)。 –

+0

Firebird(私はゼロを知っていると認めます)がJDBCドライバを持っていると仮定すると、彼は引き続きこれらのクラスを使用できます。ユニバーサル・コネクション・プールと呼ばれていることに注意してください。これはOracleのC3P0またはProxoolバージョンです。彼らはどんなJDBCドライバでも動作します。そして、はい、このプールはそれ自身の検証ロジックを行います。 – Gandalf

+0

私は "ユニバーサル"接続プールについて同意します。ただし、「JBDC 4.0準拠」とは、プールではなくJDBCドライバ(今回はOracle固有)を指します。それが私の指摘でした。 –

4

JDBC接続プールを使用していても、アプリケーションサーバーが提供されていても、Apacheのコモンプールが使用されていても、再試行ロジックをコーディングする価値があります。アプリケーションサーバーの構成に基づいて、アプリケーションサーバーはプールされたすべての接続をパージし、新しい接続を再作成します。ここにサンプルがあります:

Connection conn = null; 
    Statement stmt = null; 
    ResultSet rs = null; 
    // 
    // How many times do you want to retry the transaction 
    // (or at least _getting_ a connection)? 
    // 
    int retryCount = 5; 
    boolean transactionCompleted = false; 
    do { 

    try { 
    conn = getConnection(); // assume getting this from a 
          // javax.sql.DataSource, or the 
          // java.sql.DriverManager 

    retryCount = 0; 
    stmt = conn.createStatement(); 
    String query = "Some sample SQL"; 
    rs = stmt.executeQuery(query); 
    while (rs.next()) { 
    } 
    rs.close(); 
    rs = null; 
    stmt.close(); 
    stmt = null; 

    conn.close(); 
    conn = null; 
    transactionCompleted = true; 
    } catch (SQLException sqlEx) { 
    // 
    // The two SQL states that are 'retry-able' 
    // for a communications error. 
    // 
    // Only retry if the error was due to a stale connection, 
    // communications problem 
    // 
    String sqlState = sqlEx.getSQLState(); 
    if ("Substitute with Your DB documented sqlstate number for stale connection".equals(sqlState)) { 
     retryCount--; 
    } else { 
     retryCount = 0; 
    } 
    } finally { 
    if (rs != null) { 
     try { 
      rs.close(); 
     } catch (SQLException sqlEx) { 
      // log this 
     } 
    } 
    if (stmt != null) { 
     try { 
      stmt.close(); 
     } catch (SQLException sqlEx) { 
      // log this 
     } 
    } 
    if (conn != null) { 
     try { 
      // 
      // If we got here, and conn is not null, the 
      // transaction should be rolled back, as not 
      // all work has been done 
      try { 
       conn.rollback(); 
      } finally { 

          conn.close(); 
        } 
       } catch (SQLException sqlEx) { 
        // 
        // If we got an exception here, something 
        // pretty serious is going on, so we better 
        // pass it up the stack, rather than just 
        // logging it. . . 
        throw sqlEx; 
       } 
      } 
     } 
    } while (!transactionCompleted && (retryCount > 0)); 
} 
+0

問合せの実行中に接続が失われた場合は、次回の試行で接続が失われる可能性があります。このような場合は、実際の問題を修正してください。 –