0

こんにちは、Java で実行され、JDBC を介して MySQL データベースと通信するアプリケーションを作成しています。私が抱えている問題は、このアプリケーションがリアルタイム アプリケーションであり、データベースへの接続がどこかでダウンすることは避けられないことです。コードのスケッチは次のとおりです。

int result          = 0;
Statement st        = null;
ResultSet rs        = null;
System.out.println("Obatining reference to main connection");
Connection conne    = Main.connection;
try {
    System.out.println("In try");
    System.out.println("Creating statement");
    st = conne.createStatement();
    System.out.println("Obtaining result");
    rs = st.executeQuery("Properly constructed and tested sql query");
    rs.last();
    result = rs.getRow();
    System.out.println("Exiting try");
}catch(SQLException se){ 
    se.printStackTrace();
}finally{
    System.out.println("In finally");
    try { rs.close();    } catch (Exception e) { /* ignored */ }
    try { st.close();    } catch (Exception e) { /* ignored */ }
}
  return result;

結果の取得を印刷した後、プログラムがフリーズします。接続がアクティブな場合、すべて正常に動作しますが、データベースがダウンしないように保護する必要があります。これをテストする方法は、このメソッドを実行する直前にデータベースから切断することです。例外がスローされたり、エラーが生成されたりすることはありません。結果の取得が出力されると、プログラムは単にハングします。誰かがこのシナリオから回復する方法を知っていることを望んでいましたか? ここでも、アプリケーションは完全に実行されますが、データベースが利用できない状態から回復できるようにする必要があります。

詳しくは:

切断とは、vpn を介してデータベースに接続し、データベースを使用不可にするために vpn をシャットダウンすることを意味します。

誰かが、SQL が適切にフォーマットされていないと投稿しました。はっきりさせておきますが、これは実際の SQL ステートメントではありません。実際のステートメントを入れたくないのですが、有効なステートメントは同じ望ましくない効果を生み出すため、実際には関係ありません。

4

2 に答える 2

0

1つのオプションは、バックグラウンドスレッドでデータベース作業を行うことです。これにより、指定された時間待機し、時間が経過した場合に続行することができます。

開始する最も簡単な方法は、ExecutorServiceを使用することです。個々のタスクを送信して、返されるFutureを特定の時間待つことができます。また、 invokeAllメソッドとその仲間をチェックしてください 。

ステートメントタイムアウトを使用することもできますが、ドライバーのバグや予期しない通信の問題(たとえば、実行は速いが結果の転送に時間がかかるクエリ)がある場合は、Executorアプローチよりも信頼性が低くなる可能性があります。

于 2013-01-07T18:05:25.380 に答える
0

これはデスクトップ アプリケーションですか、それとも Java EE アプリケーションですか?

デスクトップ アプリケーションの場合は、データベースのやり取りをスレッドにして、タイムアウトを設定することができます。

それが Java EE アプリケーションであり、フレームワークを使用したくない場合は、いくつかのトランザクション ライブラリを見て、内部トランザクションに対する明示的な制御を実装できます (トランザクションにタイムアウトを追加するなど)。出発点: http://docstore.mik.ua/orelly/java-ent/ebeans/ch08_05.htm

于 2013-01-07T18:08:50.930 に答える