2016-11-26 5 views
-1

サーブレットでクエリをループしたときにロックタイムアウトが発生していたので、一度実行される長いクエリを作成することにしました。何のことはないが、必要に応じてそれを文字列に何回ループである(どのように多くのチェックボックスユーザー・チェック)し、その後に文を準備 - このコードは私のDAOであるループ内で文字列を単独で追加するときにSQLクエリにエラーが発生する

public void deactivateAccount(String[] userList) { 
    DBConnectionFactory myFactory = DBConnectionFactory.getInstance(); 
    Connection con = myFactory.getConnection(); 

    try { 
     con.setAutoCommit(false); 

     String combinedQueries = ""; 


     for (int i =0; i<userList.length;i++) { 
      String query = "UPDATE users SET active='0' WHERE userID = ? ; "; 
      combinedQueries += query; 
     } 

     System.out.println(combinedQueries); 

     PreparedStatement p = con.prepareStatement(combinedQueries); 

     for (int i =0; i<userList.length;i++) { 
      int currentNum = i+1; 
      p.setInt(currentNum, Integer.parseInt(userList[i])); 

      System.out.println("current num is " + currentNum); 
      System.out.println("userlist value is " + Integer.parseInt(userList[i])); 

     } 


      p.execute(); 



    } catch (SQLException ex) { 
     try { 
      con.rollback(); 
     } catch (SQLException ex1) { 
      Logger.getLogger(UserDAO.class.getName()).log(Level.SEVERE, null, ex1); 
     } 
     Logger.getLogger(UserDAO.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

:ここ

はコードがあります別のループ(プリペアドステートメントのパラメータを設定)して実行します。

私はエラーを取得する:

Severe: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UPDATE users SET active='0' WHERE userID = 1; UPDATE users SET active='0' WHERE ' at line 1 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

が、私はこれを実行する前に、コードでクエリを印刷する表示されるものである:

Info: UPDATE users SET active='0' WHERE userID = ?; UPDATE users SET active='0' WHERE userID = ?; UPDATE users SET active='0' WHERE userID = ?; UPDATE users SET active='0' WHERE userID = ?; (assuming 4 checkboxes were clicked)

方法は、私がリクエストから取得配列を受け入れ.getParameterValuesはサーブレットから取得します。

ありがとうございました!

答えて

0

むしろ、あなたは以下に示すようにexecuteBatch()を使用する必要があり、(パフォーマンス上の理由から)一括更新のために個別にPreparedStatement​​を実行するためのベストプラクティスではありません。

public void deactivateAccount(String[] userList) { 

    DBConnectionFactory myFactory = DBConnectionFactory.getInstance(); 
    Connection con = myFactory.getConnection(); 
    PreparedStatement p = null; 

    try { 
     con.setAutoCommit(false); 
     String query = "UPDATE users SET active='0' WHERE userID = ?"; 
     p = con.prepareStatement(query); 

     for (int i =0; i<userList.length;i++) { 
      p.setInt(1, Integer.parseInt(userList[i])); 
      p.addBatch(); 
     } 
     int[] affectedRecords = p.executeBatch(); 
     con.commit(); 
     //you can validate rows before commit, upto your requirement 
    } catch (SQLException ex) { 
     try { 
      con.rollback(); 
     } catch (SQLException ex1) { 
      Logger.getLogger(UserDAO.class.getName()).log(Level.SEVERE, null, ex1); 
     } 
     Logger.getLogger(UserDAO.class.getName()).log(Level.SEVERE, null, ex); 
    } finally { 
      if(p != null) 
       p.close(); 
      if(con != null) 
       con.close(); 
    } 
} 

あなたはの詳細についてはhereを参照することができますバッチJDBC操作。

関連する問題