使用BatchUpdateExcpetion进行JDBC BatchUpdate异常处理

时间:2016-09-21 16:16:42

标签: java mysql jdbc exception-handling

我正在尝试使用批量更新来更新表中的数据。当我更新数据时,有一些失败。我想获取失败查询的更新声明。例如,如果失败的查询是"update table set abc= 123"。然后我希望异常处理程序返回此SQL查询。

我已经尝试了几种获取SQL查询的方法,但我无法这样做。

以下是代码:

 String line=null;
 int cnt=0;
 int batchSize=100;
 BufferedReader br2=new BufferedReader(new FileReader("clean.txt"));
 stmt1=conn.createStatement();
 while((line = br2.readLine()) != null)
 {
    try {
        String sql = line;
           stmt1.addBatch(sql);
         //System.out.println(cnt);
           if(++cnt % batchSize == 0)
           {
               stmt1.executeBatch();
               conn.commit();
           }                           
        } 
    catch (BatchUpdateException ex) {
        System.out.println(ex.getLocalizedMessage());
                 int[] updateCount = ex.getUpdateCounts();
                    int cnt1 = 1;
                    for (int i : updateCount) {
                        if  (i == Statement.EXECUTE_FAILED) {
                            System.out.println("Error on request " + cnt1 +": Execute failed");
                      } else {
                            System.out.println("Request " + cnt1 +": OK");
                        }
                        cnt1++;
                    } 
                }
}
System.out.println("done");
br2.close();

请告诉我如何获取失败的SQL查询。所以,如果我有查询,我可以再将它存储在一个文件中。

1 个答案:

答案 0 :(得分:0)

getUpdateCounts的确切含义取决于驱动程序实现:JDBC规范允许 only 包含第一次失败之前成功执行的语句的更新计数,或者它包含所有语句语句执行,其中失败标记为EXECUTE_FAILED;来自BatchUpdateException

  

批量更新中的命令无法正常执行并且抛出BatchUpdateException后,驱动程序可能会也可能不会继续处理批处理中的其余命令。如果驱动程序在发生故障后继续处理,则方法BatchUpdateException.getUpdateCounts返回的数组将为批处理中的每个命令提供一个元素,而不是仅包含在错误之前成功执行的命令的元素。在驱动程序继续处理命令的情况下,任何失败命令的数组元素为Statement.EXECUTE_FAILED

换句话说,如果你想知道失败的陈述,有两种情况需要处理:

  1. 更新计数数组的长度小于批处理语句的数量 在这种情况下,第一个(数组长度)语句已成功执行。语句(数组长度)+ 1 失败,其余语句尚未执行。
  2. 数组的长度等于批处理语句的数量 在这种情况下,您可以遍历数组,值为Statement.EXECUTE_FAILED的所有索引都是失败的语句。
  3. 对于这两种情况,您需要进行簿记以跟踪批处理中的哪些语句,并将它们与失败和/或未执行的语句的索引相匹配。