PostgreSQL 9.3 executeBatch命令

时间:2014-12-23 09:14:15

标签: postgresql jdbc

我通过调用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成功。

1 个答案:

答案 0 :(得分:0)

  

我希望第一个sql命令可以工作并提交给DB。

批处理可以在自动提交模式下运行。

如果启用了自动提交,则第一个语句应该成功并提交,然后第二个语句应该失败并显示错误。检查批处理结果应该确认这一点,您应该能够看到新值。

如果自动提交已关闭,则第一个语句将开始新事务(如果尚未打开)。第二个失败并中止交易。所以这两种说法都没有任何效果。

请参阅executeBatch in AbstractJDBCStatement.java

您说您尝试使用自动提交,但不清楚是否属实。添加明确的conn.setAutoCommit(true);

如果您发现该语句仍无法在自动提交模式下生效,请提供一个完整且可编译的+ .java文件,其中包含.sql安装脚本作为{GitHub问题的附件{ {3}},当使用其main方法运行时,会演示您的问题。然后在此处评论您提交的问题的链接。还包括来自log_statement = on集的测试运行的服务器端日志。