我的业务场景是读取一个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为Text 的值无效,它应该是数字,因此会引发异常。
我在pom.xml中具有以下依赖关系,并且正在使用Spring Boot Application
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc7</artifactId>
<version>12.1.0.2</version>
</dependency>
答案 0 :(得分:1)
正式的Oracle JDBC驱动程序在central maven上。样品GAV如下所示。
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc7</artifactId>
<version>12.1.0.2</version>
</dependency>
答案 1 :(得分: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();
}