0

現在、多くの異なるクエリがあり、すべてが特定の時間に実行されるわけではない Java アプリケーションがあります。したがって、クエリごとに新しいステートメントと結果セットを作成し、それらをすぐに閉じる予定ですか? 以下に、現在クエリを実行する方法のコード スニペットを示します。各クエリを try と catch でカバーしようとしましたが、クエリが失敗した場合、グローバル レベルでロールバックが機能しないという問題があります。メモリリークもないようにするには、どのように配置するのが最善ですか?

try{ //main try outside

//lots of inner queries run based on some logics of if else etc


//sample query of opening and closing both statement and resultsets.

Statement stmt1 = null;
stmt1 = dbconn.createStatement();
String selectQuery1  = "Select query";
ResultSet rs1 = stmt1 .executeQuery(selectQuery1);
while(rs1.next()) {
//process here

}
try{
  if (rs1 != null ){
     rs1.close();
  }
  if (stmt1!= null ){
    stmt1.close()
  }
}
catch(SQLException ex){
ex.printStackTrace(System.out);
}

dbconn.commit();
}
catch (SQLException ex) { 
 try {    
   dbconn.rollback();  
 } 
 catch (Exception rollback){    
  rollback.printStackTrace(System.out);
 }
}
catch (Exception e){
 try{    
    dbconn.rollback();  
 } 
 catch (Exception rollback) {    
   rollback.printStackTrace(System.out);
 }
}
4

2 に答える 2

1
Please try keeping dbconn.setAutoCommit(false) as first statement in your first try block so that it will not insert/update/delete query unless you say dbconn.commit()


try{
       conn.setAutoCommit(false);
      Statement stmt1 = null;
      stmt1 = dbconn.createStatement();
      String selectQuery1  = "Select query";
      ResultSet rs1 = stmt1 .executeQuery(selectQuery1);
      while(rs1.next()) {
        //process here

      } 
      conn.commit();

      rs.close();
      stmt.close();
      conn.close();
   }catch(SQLException se){
      //Handle errors for JDBC
      se.printStackTrace();
      try{
         if(conn!=null)
            conn.rollback();
      }catch(SQLException se2){
         se2.printStackTrace();
      }//end try

   }catch(Exception e){
      e.printStackTrace();
   }finally{
      //finally block used to close resources
      try{
         if(rs!=null)
            rs.close();
      }catch(SQLException se2){
      }// nothing we can do
      try{
         if(stmt!=null)
            stmt.close();
      }catch(SQLException se2){
      }// nothing we can do
      try{
         if(conn!=null)
            conn.close();
      }catch(SQLException se){
         se.printStackTrace();
      }//end finally try
   }//end try
}//
于 2012-08-17T18:23:23.107 に答える
1

ロールバックを機能させるには、まず が initial にautoCommit設定されているかどうかを確認する必要がありますfalse。すべての操作が正常に実行された場合にのみコミットする必要があります。

これを行う 1 つの方法は、次のような構造を使用することです。

Connection connection = getDBConnection(); //Depends on how you get your connection
boolean autoCommit = connection.getAutoCommit();
try{
    //Set autoCommit to false. You will manage commiting your transaction
    connection.setAutoCommit(false); 
    //Perform your sql operation

    if(doCommit){ //all your ops have successfully executed, you can use a flag for this
        connection.commit();
    }
}catch(Exception exe){
    //Rollback
}finally{
    connection.setAutoCommit(autoCommit); //Set autoCommit to its initial value
}
于 2012-08-17T18:20:01.537 に答える