[BatchUpdateException一旦发生异常就不会继续执行流程

问题描述 投票:0回答:2

我的业务场景是读取一个csv文件及其内容,然后持久保存到oracle数据库中。

考虑该csv文件中有1000行。迭代每行及其列的值,并设置为prepareStatement,然后使用prepareStatement.addBatch()添加到批处理中,然后执行批处理。请参阅下面的示例。

try {
  for(List<String> mainList:dataList) { //lines
     int i=1;
     ps = conn.prepareStatement(insertQuery);
     for(String value:mainList) { //column values
        ps.setString(i++, value);
     }
     ps.addBatch();
  }
  int[] updateCounts = ps.executeBatch(); //50th record not valid

  } catch(BatchUpdateException e){
       int[] updateCounts = e.getUpdateCounts();
  }

这里addbatch将具有所有行(1000)和值,例如第50条记录值的示例无效。截至目前,批处理已执行(插入)49条正确记录在数据库表中。在插入第50条记录时,由于不是有效记录,executebatch在catch块中抛出BatchUpdateException(可能是任何问题)。

此后,流程被阻塞,不再继续执行该批处理中的剩余950条记录。我想要的是一旦引发异常,我的代码应运行并在数据库中插入剩余的950条记录。

[请帮助解决此问题,或提供其他任何替代方法来实现此逻辑。

CSV样本:

Name,Id,Firstname,Lastname
Bharathi,2070,Bharathi,Raja   --> row 1
Craig,Text,Craig,Johnson      --> row 2
Mary,9346,Mary,Jenk           --> row 3

考虑第2行是第50条记录,Id为文本的值无效,它应该是数字,因此引发异常。

我在pom.xml中具有以下依赖关系,并且正在使用Spring Boot Application

<dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc7</artifactId>
    <version>12.1.0.2</version>
</dependency>
java oracle jdbc ojdbc
2个回答
1
投票

官方的Oracle JDBC驱动程序在central maven上。样品GAV如下所示。

<dependency>
    <groupId>com.oracle.database.jdbc</groupId>
    <artifactId>ojdbc7</artifactId>
    <version>12.1.0.2</version>
</dependency>

0
投票

找到了解决此类问题的替代方法。

我在将值设置为preparestatement并添加到批处理之前已进行了事前验证。这样始终有效的记录只会添加到批处理中。

我从表中获取了列名和数据类型,并保留为Map(columnDataTypeMap)进行验证。

try {
  boolean skipFlag=true;
  for(List<String> mainList:dataList) { //lines
     int i=1;
     ps = conn.prepareStatement(insertQuery);
     for(String value:mainList) { //column values
        try {
               String columnName = csvHeader.split(",")[columnCount];
               String dataType = columnDataTypeMap.get(columnName.toUpperCase());
               if("VARCHAR2".equalsIgnoreCase(dataType)) {
                    ps.setString(i++, String.valueOf(value));
               } else if("NUMBER".equalsIgnoreCase(dataType)) {
                    ps.setInt(i++, Integer.valueOf(value));
               }
        }catch(Exception e) {
            skipFlag = false;
        }
     }
    if(skipFlag) {
        ps.addBatch();
    }
  }
  int[] updateCounts = ps.executeBatch();

  } catch(BatchUpdateException e){
       int[] updateCounts = e.getUpdateCounts();
  }
© www.soinside.com 2019 - 2024. All rights reserved.