2009-08-15 16 views
0

Je suis en train de passer l'aspirateur ma base de données Postgres en exécutant l'instruction SQL suivante dans Java:JDBC délai d'attente vide postgres

vide Analysons bavard

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

SET statement_timeout xxxx

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

Répondre

2

Je viens de tester et "vide" honore "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(); 
       } 
     } 
} 

J'obtiens 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 avez à (temporaire) permettent autocommit votre connexion.

1

Je ne pense pas qu'il y ait une bonne façon (c.-à-sûr) pour tuer le processus autre que le redémarrage de la base de données. Je ne connais pas non plus d'option de délai d'attente de transaction.

La meilleure solution consiste à déterminer ce qui cause le blocage et la réparation de ce problème. Il est probable que le vide attende la libération d'un verrou de transaction. Utilisez la vue pg_locks pour voir si c'est le cas. Si vous pouvez voir quelle ressource est verrouillée, vous pouvez commencer à résoudre ce problème.

1

Cette erreur peut se produire si le serveur Postgres prend autant de temps pour charger des données, c'est-à-dire si une requête particulière est en cours, il faudra du temps pour charger cette exception.