2016-09-21 85 views
0

我正在尝试使用批量更新来更新表中的数据。当我更新数据时,会出现一些故障。我想获取失败查询的更新语句。例如,如果失败的查询是"update table set abc= 123"。然后我想让异常处理程序返回这个SQL查询。使用BatchUpdateExcpetion进行JDBC BatchUpdate异常处理

我已经尝试了几种方法来获取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查询。所以,如果我有查询,我可以再次将它存储在文件中。

回答

0

getUpdateCounts的确切含义取决于驱动程序实现:JDBC规范允许要么只有包含了成功的更新计数第一次失败之前执行的语句,或者它包含的所有语句执行,其故障都标有值为EXECUTE_FAILED;从BatchUpdateException

之后以间歇更新的命令无法正确执行以及BatchUpdateException被抛出,驾驶员可能或可能不继续处理在批处理中的剩余命令。如果驱动程序在故障发生后继续处理,则方法BatchUpdateException.getUpdateCounts返回的数组将对批处理中的每个命令都有一个元素,而不仅仅是在错误发生前成功执行的命令的元素。在驱动程序继续处理命令的情况下,任何失败命令的数组元素是Statement.EXECUTE_FAILED

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

  1. 更新的长度计算阵列比批处理的语句的数量。
    在这种情况下,第一个(数组长度)语句已成功执行。声明(数组长度)+ 1失败,其余的语句尚未执行。
  2. 数组的长度等于批处理语句的数量。
    在这种情况下,您可以遍历数组,并且值为Statement.EXECUTE_FAILED的所有索引都是失败语句。

对于这两种情况,您都需要做记录来跟踪批处理中的哪些语句,并将它们与失败和/或未执行语句的索引进行匹配。