我使用的是ibatis-sqlmap-2.3.0版本,需要在表中插入大约70K行。
使用SqlExecutorBatch功能,我还想知道executeBatch()中间失败的语句的索引;
以下是相同的代码段。
public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException {
executor.startBatch();
try {
for (TableRow ar1 : AllRows) {
executor.insert("myRates.insertData", ar1);
}
aBatchList = executor.executeBatchDetailed();
} catch (BatchException e) {
e.printStackTrace();
System.out.println("failing exception " + e.getFailingSqlStatement());
System.out.println("failing statement id " + e.getFailingStatementId());
System.out.println("message exception is " + e.getMessage());
System.out.println(e.getSuccessfulBatchResults());
}
}
问题:当失败的结果出现时,它会给我重复数据的错误,并显示消息"om.ibatis.sqlmap.engine.execution.BatchException:1号子批次失败。"
索引1是错误的,因为我知道其他行有重复的条目。
原因:我检查了这个jar的代码,它只考虑由我的所有executor.insert("ratesUtil.insertAreaData",ar1)组成的单个语句;
因此索引为1。
输出供您参考:
1) System.out.println("失败异常"+e.getFailingqlStatement());--插入表中的值(?,?,?)2) System.out.println("失败语句id"+e.getFailingStatementId());3) System.out.println("消息异常为"+e.getMessage())--子批次号1失败。4) System.out.println(e.getSuccessfulBatchResults());--空
请帮我1) 如何将这些插入查询设置为单个executor中的多个批处理语句,并在单个executor.executeBatch()中执行所有这些批处理语句;
2) 是否有其他方法可以获得失败语句的正确索引。
由于项目配置存在一些问题,我无法更改版本。也不想依赖updateCount。
您可以添加多个批处理,而不是在一个批处理中使用一个adding all语句。这会让你知道哪一批给了你问题。但这并不是你问题的实际答案,只是