【问题标题】:JDBC postgres vacuum timeoutJDBC postgres 真空超时
【发布时间】:2010-11-19 20:40:06
【问题描述】:

我正在尝试通过在 Java 中运行以下 SQL 指令来清理我的 Postgres 数据库:

真空详细分析

有时它似乎只是“挂起”,有什么干净的方法可以中止进程吗?我试过了

SET statement_timeout TO XXXX

但我收到错误消息“VACCUM 无法在事务块内运行”

【问题讨论】:

    标签: postgresql jdbc vacuum


    【解决方案1】:

    我刚刚测试过,“vacuum”确实尊重“statement_timeout”。示例程序:

    import java.sql.*;
    
    class test
    {
            public static void main(String[] args) {
                    try {
                            Class.forName("org.postgresql.Driver");
                            Connection connection =
                                    DriverManager.getConnection(
                                            "jdbc:postgresql://hostname/dbname",
                                            "username",
                                            "password"
                                    );
                            connection.createStatement().executeUpdate(
                                    "set statement_timeout to 500"
                            );
                            connection.createStatement().executeUpdate(
                                    "vacuum analyze"
                            ); 
                    } catch (Exception ex) {
                            ex.printStackTrace();
                    }
            }
    }
    

    我收到以下错误:

    org.postgresql.util.PSQLException: ERROR: canceling statement due to statement timeout
        at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2062)
        at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1795)
        at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:479)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:353)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:299)
        at test.main(test.java:14)
    

    也许您必须(临时)在您的连接上启用自动提交。

    【讨论】:

      【解决方案2】:

      如果 postgres 服务器花费太多时间来加载数据,即如果对于特定查询,它们的结果太多,加载它需要时间并且会抛出此异常,则可能会发生此错误。

      【讨论】:

        【解决方案3】:

        我认为除了重新启动数据库之外,没有什么好的(即安全的)方法可以杀死进程。我也不知道有任何事务超时选项。

        最好的解决方案是找出导致挂起的原因并解决该问题。真空可能正在等待释放事务锁。使用pg_locks 视图查看是否是这种情况。如果您可以看到正在锁定的资源,您就可以开始解决该问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-15
          • 2016-09-08
          • 1970-01-01
          • 2017-01-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多