1

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

真空详细分析

有时它似乎只是“挂起”是否有任何干净的方法可以中止该过程?我试过了

SET statement_timeout TO XXXX

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

4

3 回答 3

3

我刚刚测试过,“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)

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

于 2009-08-17T12:39:08.150 回答
1

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

于 2012-10-31T12:24:33.770 回答
0

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

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

于 2009-08-15T08:42:32.017 回答