我通过调用executeBatch()
JDBC函数将以下命令添加到批处理并执行它。
insert into blabla (id,value) values ('1','666666')
insert into blabla (id,value) values ('1','8888')
id
是唯一的。
我希望第一个sql命令可以工作并提交给DB。
executeBatch()
命令的API表示当抛出BatchUpdateException
异常时,所有先前成功的SQL都将提交给DB。
实际结果是没有向DB提交sql命令。为什么呢?
我使用以下语法:
int[] res = null;
try {
conn.setAutoCommit(false);
Statement batch_stmt = conn.createStatement();
for (String sql: sqlList) {
batch_stmt.addBatch(sql);
}
res = batch_stmt.executeBatch();
conn.commit();
batch_stmt.clearBatch();
batch_stmt.close();
} catch (BatchUpdateException e) {
int[] err_res = e.getUpdateCounts();
try {
conn.commit();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} catch (SQLException e) {
e.printStackTrace();
}
此外,我尝试自动提交true,我得到了相同的结果。
int[] res = null;
try {
Statement batch_stmt = conn.createStatement();
for (String sql: sqlList) {
batch_stmt.addBatch(sql);
}
res = batch_stmt.executeBatch();
batch_stmt.clearBatch();
batch_stmt.close();
} catch (BatchUpdateException e) {
int[] err_res = e.getUpdateCounts();
} catch (SQLException e) {
e.printStackTrace();
}
顺便说一句,e.getUpdateCounts();
返回第一个sql成功。
答案 0 :(得分:0)
我希望第一个sql命令可以工作并提交给DB。
批处理可以在自动提交模式下运行。
如果启用了自动提交,则第一个语句应该成功并提交,然后第二个语句应该失败并显示错误。检查批处理结果应该确认这一点,您应该能够看到新值。
如果自动提交已关闭,则第一个语句将开始新事务(如果尚未打开)。第二个失败并中止交易。所以这两种说法都没有任何效果。
请参阅executeBatch
in AbstractJDBCStatement.java
。
您说您尝试使用自动提交,但不清楚是否属实。添加明确的conn.setAutoCommit(true);
。
如果您发现该语句仍无法在自动提交模式下生效,请提供一个完整且可编译的+ .java
文件,其中包含.sql
安装脚本作为{GitHub问题的附件{ {3}},当使用其main
方法运行时,会演示您的问题。然后在此处评论您提交的问题的链接。还包括来自log_statement = on
集的测试运行的服务器端日志。