我正试图通过在Java中运行以下SQL指令来清空我的Postgres数据库:
真空详细分析
有时似乎“挂起”是否有任何干净的方法来中止这个过程?我试过了
SET statement_timeout TO XXXX
但是我收到错误消息“VACCUM无法在事务块内运行”
答案 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
视图查看是否是这种情况。如果您可以看到正在锁定的资源,则可以开始解决该问题。