Frage

Ich versuche, meine Postgres -Datenbank zu vakuumieren, indem ich die folgende SQL -Anweisung in Java ausführte:

Vakuumausbose analysieren

Manchmal scheint es nur "hängen" zu sein. Gibt es einen sauberen Weg, um den Prozess abzubrechen? Ich habe versucht

Setzen Sie Anweisung_Timeout auf xxxx

Aber ich erhalte die Fehlermeldung "Impfstoff kann nicht im Transaktionsblock ausgeführt werden".

War es hilfreich?

Lösung

Ich habe gerade getestet und "Vakuum" ehren "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();
                }
        }
}

Ich bekomme den folgenden Fehler:

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 müssen Sie (vorübergehend) AutoCommit in Ihrer Verbindung aktivieren.

Andere Tipps

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 sind, dauert es einige Zeit, um dies zu laden, und diese Ausnahme ausgelegt.

Ich glaube nicht, dass es einen guten (dh sicheren) Weg gibt, den Prozess zu töten, als die Datenbank neu zu starten. Mir ist auch keine Timeout -Option für Transaktionen bekannt.

Die beste Lösung besteht darin, herauszufinden, was das Problem verursacht und das Problem behebt. Es ist wahrscheinlich, dass das Vakuum darauf wartet, dass eine Transaktionsschloss freigegeben wird. Verwenden Sie das pg_locks Sehen Sie sich an, ob dies der Fall ist. Wenn Sie sehen können, welche Ressource gesperrt wird, können Sie anfangen, dieses Problem anzugehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top