Domanda

Sto cercando di aspirare il mio database Postgres eseguendo le seguenti istruzioni SQL all'interno di Java:

vuoto verbose analisi

A volte sembra proprio di "appendere" c'è un modo pulito per interrompere il processo? Ho cercato

SET statement_timeout TO XXXX

Ma ottengo il messaggio di errore "VUOTO non può essere eseguito all'interno del blocco di transazione"

È stato utile?

Soluzione

Ho appena provato e "vuoto" fa onore "statement_timeout". Esempio di programma:

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

ottengo il seguente errore:

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)

Forse si deve (temporaneo) abilitare autocommit sulla vostra connessione.

Altri suggerimenti

Questo errore può verificarsi se il server Postgres sta prendendo così tanto tempo per caricare cioè se i dati per una determinata query, la loro è così molti risultati, ci vorrà del tempo per caricare e che getterà questa eccezione.

Non credo che ci sia un buon modo (vale a dire sicuro) per uccidere il processo diverso di riavviare il database. Io non sono a conoscenza di qualsiasi opzione di timeout della transazione sia.

La soluzione migliore è quella di capire che cosa sta causando il blocco di fissaggio e quel problema. È probabile che il vuoto è in attesa di un blocco di transazione per essere rilascio. Utilizzare la vista pg_locks per vedere se questo è il caso. Se si riesce a vedere ciò che di risorse che viene bloccato, è possibile iniziare ad affrontare tale questione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top