JDBC postgres真空超时

时间:2009-08-15 06:44:31

标签: postgresql jdbc vacuum

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

真空详细分析

有时似乎“挂起”是否有任何干净的方法来中止这个过程?我试过了

SET statement_timeout TO XXXX

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

3 个答案:

答案 0 :(得分: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)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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