Question

Je suis en train de passer l'aspirateur ma base de données Postgres en exécutant l'instruction SQL suivante dans Java:

vide analyser verbeuse

Parfois, il semble juste « accrocher » est-il un moyen propre pour interrompre le processus? J'ai essayé

SET statement_timeout A XXXX

Mais je reçois le message d'erreur « VACCUM ne peut pas fonctionner à l'intérieur du bloc de transaction »

Était-ce utile?

La solution

Je viens de tester et « vide » fait honneur « statement_timeout ». Exemple de programme:

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

Je reçois l'erreur suivante:

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)

Peut-être que vous devez (temporaire) activer la validation automatique de votre connexion.

Autres conseils

Cette erreur peut se produire si le serveur postgres prend beaucoup de temps pour charger i.e. de données si pour une requête particulière, leur est tant de résultats, il faudra du temps pour charger que et jetteront cette exception.

Je ne pense pas qu'il y ait un bon (à savoir la sécurité) façon de tuer le processus autre que redémarrer la base de données. Je ne suis pas au courant d'aucune option de délai d'attente de transaction soit.

La meilleure solution est de trouver ce qui cause le blocage et la fixation de ce problème. Il est probable que le vide est en attente d'un verrou de transaction à la libération. Utilisez la vue pg_locks pour voir si tel est le cas. Si vous pouvez voir ce que ressource est verrouillé, vous pouvez commencer à répondre à cette question.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top