JDBC postgres timeout vuoto
-
16-09-2019 - |
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"
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.