Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java PostgreSQL事务失败:“没有正在进行的事务”_Java_Postgresql_Jdbc_Transactions - Fatal编程技术网

Java PostgreSQL事务失败:“没有正在进行的事务”

Java PostgreSQL事务失败:“没有正在进行的事务”,java,postgresql,jdbc,transactions,Java,Postgresql,Jdbc,Transactions,我尝试使用JDBC for PostgreSQL执行一个相当长的事务。在JDBC中,我不能使用提交和回滚,所以我试图用Java代码实现我想要的行为 try { con = DriverManager.getConnection(url, user, password); con.setAutoCommit(false); Statement st = con.createStatement(); st.execute(myHugeTransaction);

我尝试使用JDBC for PostgreSQL执行一个相当长的事务。在JDBC中,我不能使用提交和回滚,所以我试图用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]
有趣的是,如果我用st.getWarnings捕捉SQL警告;我可以看到,数据库实际上正在处理我发送的整个脚本,就在提交时,一切都失败了

顺便说一句,交易完全没有问题。我将它的一个精确副本写入一个文件,通过将它复制到pgAdmin中,我可以毫无错误地运行它。希望你能在这方面帮助我,我已经搜索和测试了几个小时了

编辑

也许我没弄好,所以有两个问题:

我可以在对Statement.execute的一次调用中执行多个语句吗? 如果不是,那么使用JDBC运行包含多个语句的脚本的正确方法是什么,而不需要将其解析并拆分为单个语句?
老实说,如果这是一个SQL脚本,您最好执行到psql的shell转义。这是最好的处理方法。一般来说,人们试图解析SQL代码并在db上运行它时,我遇到了太多令人不快的惊喜。这样,疯狂就是谎言

你说的是更小的脚本,这让我得出结论,你正在做一些事情,比如设置数据库或升级数据库,但这不太可能,因为没有查询。通过shell转义使用psql,不要回头看。这确实是最好的办法

我想如果必须的话,您可以尝试在脚本中添加显式的BEGIN和COMMIT


我不知道为什么它似乎在隐式地提交事务。您已正确设置自动提交。代码中没有明显的问题。您是否可能有一个旧的或有缺陷的JDBC驱动程序?如果没有,我建议向PostgreSQL JDBC驱动程序项目提交错误报告。

您没有直接或间接在脚本中执行提交操作?此错误来自pgpool。您可能正在抛出pgpool配置不支持的多语句查询。如果您在对“statement.execute”的一次调用中执行多个语句,则您没有按预期使用JDBC API。我的脚本中没有BEGIN、COMMIT或ROLLBACK。是的,我使用的是一个multi语句,但不是查询,而是DROP、ALTER、CREATE。一次调用中的多个语句适用于较小的脚本,但如果不是故意的,如何执行这样的脚本?我需要编写一个完整的SQL解析器来将脚本拆分为单个语句。。。