Java 如何在批处理中获取包含异常的精确sql查询
我要执行以下操作: (从处理数据库的提取行传输到行的表示数据库)Java 如何在批处理中获取包含异常的精确sql查询,java,sql,exception-handling,batch-processing,sqlexception,Java,Sql,Exception Handling,Batch Processing,Sqlexception,我要执行以下操作: (从处理数据库的提取行传输到行的表示数据库) 因此,我可以看到有无任何错误的更改,但看起来BatchUpdateException不起作用?引用BatchUpdateException的javadoc: 数组中元素的顺序 更新计数与订单相对应 其中命令被添加到 一批 在批处理更新中的命令之后 未能正确执行,并且 引发BatchUpdateException时 驾驶员可以继续驾驶,也可以不继续驾驶 处理中的其余命令 一批。如果司机继续 处理失败后,阵列 由方法返回 BatchU
因此,我可以看到有无任何错误的更改,但看起来BatchUpdateException不起作用?引用BatchUpdateException的javadoc: 数组中元素的顺序 更新计数与订单相对应 其中命令被添加到 一批 在批处理更新中的命令之后 未能正确执行,并且 引发BatchUpdateException时 驾驶员可以继续驾驶,也可以不继续驾驶 处理中的其余命令 一批。如果司机继续 处理失败后,阵列 由方法返回 BatchUpdateException.getUpdateCounts 每个命令都有一个元素 在批处理中,而不是仅在元素中 对于执行的命令 在错误发生之前,已成功执行。在 司机继续驾驶的情况 处理命令,数组元素 对于任何失败的命令 语句。执行失败
如前所述,您只能访问批处理过程中失败的SQL语句的索引。这意味着,为了重新创建无法执行的同一语句,您应该以可索引的方式存储参数,例如:
List<...>paramList = new ArrayList<...>();
for (... params in paramList) {
stmt.clearParameters();
stmt.setString(...something involving params...);
// etc.
}
ListparamList=newarraylist();
对于(…参数列表中的参数){
stmt.clearParameters();
stmt.setString(…涉及参数的某物…);
//等等。
}
这样,带有
EXECUTE\u FAILED
数组的getUpdateCounts
索引可用于识别导致失败的参数。创建一个有助于执行命令的DB层,如果sql命令失败,请使用while循环或其他方法重试几次,如果在几次之后仍然失败,那么记录它。我正在mysql中使用mysql-connector-java-3.1.14。本主题顶部的更新(使用BatchUpdateException和getUpdateCounts)工作正常。现在,我可以在batch insert/update中找到有问题的行。您好,感谢您的即时回复,我已经更新了我的问题,希望您能为此输入任何信息,谢谢!
public static void processUpdateCounts(int[] updateCounts) {
for (int i=0; i<updateCounts.length; i++) {
if (updateCounts[i] >= 0) {
// Successfully executed; the number represents number of affected rows
logger.info("Successfully executed: number of affected rows: "+updateCounts[i]);
} else if (updateCounts[i] == Statement.SUCCESS_NO_INFO) {
// Successfully executed; number of affected rows not available
logger.info("Successfully executed: number of affected rows not available: "+updateCounts[i]);
} else if (updateCounts[i] == Statement.EXECUTE_FAILED) {
logger.info("Failed to execute: "+updateCounts[i]);
// Failed to execute
}
}
}
processUpdateCounts(updateCounts);
List<...>paramList = new ArrayList<...>();
for (... params in paramList) {
stmt.clearParameters();
stmt.setString(...something involving params...);
// etc.
}