JDBC Postgres A vácuo tempo limite
-
16-09-2019 - |
Pergunta
Estou tentando aspirar meu banco de dados PostGres executando a seguinte instrução SQL dentro de Java:
Analisão de vácuo detalhado
Às vezes, parece apenas "pendurar", há alguma maneira de abortar o processo? eu tentei
Definir instrution_timeout para xxxx
Mas recebo a mensagem de erro "O Vaccum não pode ser executado dentro do bloco de transações"
Solução
Acabei de testar e "vácuo" honra "declaração_timeout". Exemplo de programa:
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();
}
}
}
Estou tendo o erro a seguir:
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)
Talvez você precise (temporário) ativar o AutoComit em sua conexão.
Outras dicas
Esse erro pode ocorrer se o servidor Postgres estiver levando muito tempo para carregar dados, ou seja, se, para uma consulta específica, seus resultados são tantos resultados, levará tempo para carregar isso e lançará essa exceção.
Eu não acho que exista uma maneira boa (ou seja, segura) de matar o processo além de reiniciar o banco de dados. Também não estou ciente de nenhuma opção de tempo limite da transação.
A melhor solução é descobrir o que está causando o pendurar e corrigir esse problema. É provável que o vácuo esteja esperando a liberação de um bloqueio de transação. Use o pg_locks
Vista para ver se esse é o caso. Se você pode ver qual recurso está sendo bloqueado, pode começar a resolver esse problema.