2009-08-15 12 views
0

Ich versuche, indem Sie die folgende SQL-Anweisung in Java meine Postgres-Datenbank Vakuum:JDBC Postgres Vakuum Timeout

Vakuum ausführliche

Manchmal analysieren es scheint nur zu „hängen“ gibt es eine saubere Art und Weise zu den Prozess abbrechen? Ich habe

versucht

SET statement_timeout XXXX

Aber ich bekomme die Fehlermeldung „VACCUM kann nicht innerhalb des Transaktionsblock laufen“

Antwort

2

Ich habe gerade getestet und "Vakuum" honoriert "statement_timeout". Beispielprogramm:

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(); 
       } 
     } 
} 

bekomme ich folgende Fehlermeldung:

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) 

Vielleicht haben Sie (vorübergehend) ermöglichen autocommit auf Ihre Verbindung.

1

Ich glaube nicht, gibt es eine gute (dh sicher) Art und Weise der zu töten Prozess anders als das Neustarten der Datenbank. Mir ist auch keine Transaktionszeitlimitoption bekannt.

Die beste Lösung ist herauszufinden, was den Hang verursacht und dieses Problem behebt. Es ist wahrscheinlich, dass Vakuum auf die Freigabe einer Transaktionssperre wartet. Verwenden Sie die Ansicht pg_locks, um festzustellen, ob dies der Fall ist. Wenn Sie sehen können, welche Ressource gesperrt ist, können Sie damit beginnen, dieses Problem zu beheben.

1

Dieser Fehler kann auftreten, wenn der Postgres-Server so viel Zeit benötigt, um Daten zu laden. Wenn für eine bestimmte Abfrage so viele Ergebnisse vorliegen, dauert es einige Zeit, bis diese geladen wird.