2009-08-15 21 views
0

私は、Java内で以下のSQL命令を実行して、私のPostgresデータベースを真空にしようとしている:JDBCのPostgresの真空タイムアウト

真空冗長

を分析時にはそれだけに任意のクリーンな方法があり、「ハング」ように見えますプロセスを中止しますか?私は殺すために良い(すなわち安全な)方法はないと思う

答えて

2

私はちょうどテストしました。 "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

を私は

をXXXX TO

のSETのstatement_timeoutを試してみました。しかし、私は、「真空はトランザクションブロック内で実行することはできません」というエラーメッセージが表示されますデータベースを再起動する以外の処理。私はいずれのトランザクションタイムアウトオプションも認識していません。

最適な解決策は、何がハングを引き起こしているのか把握し、その問題を解決することです。バキュームがトランザクションロックが解放されるのを待っている可能性があります。この場合、pg_locksビューを使用して確認してください。ロックされているリソースがわかると、その問題に対処できます。

1

このエラーは、データのロードに時間がかかり、特定のクエリの結果が非常に多く、ロードに時間がかかり、この例外がスローされる場合に発生する可能性があります。

関連する問題