2016-04-01 4 views
0

私のコードはJDBC接続を確立し、Microsoft SQL SMSを繰り返し照会します。しかし、時々私はエラーを取得する:ここでJDBC: "SocketException:Connection reset"により "SQLException:入出力エラー:接続リセットが発生しました"をキャッチ

"Exception in thread "main" java.sql.SQLException: I/O Error: Connection reset" followed by "Caused by: java.net.SocketException: Connection reset" enter image description here

は私のコードは次のようになります。

public static void main(String[] args){ 
    ... 
    // Establish JDBC connection 
    Class.forName(DRIVER); 
    Connection conn = DriverManager.getConnection(URL, USER, PASS); 
    Statement stmt = conn.createStatement(); 
    ... 
    // Perform SQL query 
    for(int i=0; i<size; i++) 
     functionA(stmt); // <--line 62 
    ... 
} 

public static void functionA(Statement stmt){ 
    String aql = "INSERT INTO..."; 
    stmt.executeUpdate(sql); // <-- line 105 
} 

私はデータとは関係のないいくつかの機能をテストするために、データベースを照会します。したがって、例外がスローされたときにプログラムが自動的に接続を再確立するようにして、それをそのまま実行しておくことができます。

質問: 1)try ... catchでJDBC接続を再確立することはできますか? 2)そうであれば、どの例外をキャッチし、どこにキャッチするか? 3)私はキャッチで何を置くべきですか?あなたが質問に記載された例外をキャッチしたい場合には

+0

プログラムのどの部分がデータベースを「繰り返し照会」しますか? – Berger

+0

functionAをラップするfor-loopです。 – Sean

+0

例外のスタックトレースをスクリーンショットとしてではなくテキストとして含めてください。 –

答えて

1

、あなたはたとえば、のSQLExceptionをキャッチする必要があります。

// Perform SQL query 
    for(int i=0; i<size; i++) { 
     try { 
     functionA(stmt); // <--line 62 
     } catch(SQLException e) { 
      System.out.println(e.getMessage()); 
      //You can add here your recovery logic ... 
     } 
    } 

そして、はい、あなたは後に接続を再確立しようとすることができます例外は)あなたがgetCause(とそれを確認することができSQLExceptionが発生し、内部例外をチェックしたい場合は... catchブロック内の所定の位置に

を再接続機構のようなものを置く:

 } catch(SQLException e) { 
      if(e.getCause() instanceof SocketException) { 
      //You can add here your recovery logic ... 
      } 
     } 
+0

エラーメッセージによると、SQLExceptionの "原因"がSocketExceptionではありませんでしたか?あなたは私が接続を再確立するかもしれないことを知っていますか? – Sean

+0

はい、あなたが望むなら内部の例外をチェックすることもできます...それはあなたが何をする必要があるかによって異なります... – aleroot

+0

私は私のプログラムが停止して再接続をしないようにしたいと思います。どんな修正であれ、それは私にとってうまくいきます。 – Sean

関連する問題