JDBCのPostgresの真空タイムアウト
-
16-09-2019 - |
質問
私は、Java内で以下のSQL命令を実行して、私のPostgresデータベースを真空にしようとしています:
真空冗長解析
時にはそれだけで「ハング」ように見えるプロセスを中止する任意のきれいな方法はありますか?私が試してみました。
XXXX TO SETののstatement_timeout
しかし、私はエラーメッセージが表示されます。
「真空は、トランザクションブロック内で実行することはできません」解決
私はちょうどテストしてみた「真空は」名誉「の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)
たぶん、あなたは(一時的な)あなたの接続で自動コミットを有効にする必要があります。
他のヒント
特定のクエリのために、非常に多くの結果は、それはそれをロードするために時間がかかりますし、この例外をスローします自分の場合はpostgresサーバはデータすなわちをロードするために多くの時間がかかっている場合は、
このエラーが発生する可能性があります。
私は、データベースを再起動する以外のプロセスを殺すために良い(すなわち安全な)方法はないと思います。私はどちらか任意のトランザクションタイムアウトオプションを認識していないよ。
最善の解決策は、ハングアップの原因となって、その問題を修正何を把握することです。これは、真空が解除されるトランザクションのロックを待っている可能性があります。このケースかどうかを確認するためにpg_locks
ビューを使用します。あなたはどのようなリソースがロックされて見ることができる場合は、その問題に対処するために始めることができます。
所属していません StackOverflow