我有一个很长的事务,我正在尝试使用 JDBC for PostgreSQL 执行。在 JDBC 中我不能使用COMMIT
and ROLLBACK
,所以我试图在 Java 代码中实现我想要的行为......
try {
con = DriverManager.getConnection(url, user, password);
con.setAutoCommit(false);
Statement st = con.createStatement();
st.execute(myHugeTransaction);
con.commit();
} catch (SQLException ex) {
try {
con.rollback();
} catch (SQLException ex1) {
// log...
}
// log...
}
对于小型语句,这工作得很好,但对于在单个事务中有大约 10K 语句的大型语句,这会con.commit
失败
org.postgresql.util.PSQLException: ERROR: kind mismatch among backends. Possible last query was: "COMMIT" kind details are: 0[C] 1[N: there is no transaction in progress]
有趣的是,如果我捕捉到 SQL 警告,st.getWarnings();
我可以看到数据库实际上正在处理我发送的整个脚本,就在提交时,一切都失败了。
顺便说一句,交易完全没问题。我将它的精确副本写入一个文件,我可以通过将它复制到 pgAdmin 来运行它而不会出错。希望你能在那个问题上帮助我,我已经搜索和测试了几个小时了......
编辑
也许我没有得到正确的答案,所以有两个问题:
- 我可以在一次调用中执行多个语句
Statement.execute()
吗? - 如果不是,那么使用 JDBC 运行具有多个语句的脚本的正确方法是什么(无需解析并将其拆分为单个语句)?