【问题标题】:JDBC BatchUpdate exception handling using BatchUpdateExcpetion使用 BatchUpdateExcpetion 处理 JDBC BatchUpdate 异常
【发布时间】:2017-01-30 00:09:31
【问题描述】:

我正在尝试使用批量更新来更新表中的数据。当我更新数据时,出现了一些故障。我想获取失败查询的更新语句。例如,如果失败的查询是"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 查询。因此,如果我有查询,我可以再次将其存储在文件中。

【问题讨论】:

    标签: java mysql jdbc exception-handling


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-04-06
      • 1970-01-01
      • 1970-01-01
      • 2012-07-03
      • 1970-01-01
      • 1970-01-01
      • 2013-03-19
      • 2016-01-07
      • 2015-11-04
      相关资源
      最近更新 更多