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"

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top