我正在尝试使用批量更新来更新表中的数据。当我更新数据时,有一些失败。我想获取失败查询的更新声明。例如,如果失败的查询是"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查询。所以,如果我有查询,我可以再将它存储在一个文件中。
答案 0 :(得分:0)
getUpdateCounts
的确切含义取决于驱动程序实现:JDBC规范允许 only 包含第一次失败之前成功执行的语句的更新计数,或者它包含所有语句语句执行,其中失败标记为EXECUTE_FAILED
;来自BatchUpdateException
:
批量更新中的命令无法正常执行并且抛出
BatchUpdateException
后,驱动程序可能会也可能不会继续处理批处理中的其余命令。如果驱动程序在发生故障后继续处理,则方法BatchUpdateException.getUpdateCounts
返回的数组将为批处理中的每个命令提供一个元素,而不是仅包含在错误之前成功执行的命令的元素。在驱动程序继续处理命令的情况下,任何失败命令的数组元素为Statement.EXECUTE_FAILED
。
换句话说,如果你想知道失败的陈述,有两种情况需要处理:
Statement.EXECUTE_FAILED
的所有索引都是失败的语句。对于这两种情况,您需要进行簿记以跟踪批处理中的哪些语句,并将它们与失败和/或未执行的语句的索引相匹配。