Pregunta

Estoy tratando de aspirar mi base de datos PostgreSQL ejecutando la siguiente instrucción SQL en Java:

vacío verbosa analizar

A veces sólo se parece a "colgar" ¿hay alguna manera limpia para abortar el proceso? He tratado

SET statement_timeout A XXXX

Pero consigo el mensaje de error "VACCUM no se puede ejecutar en el interior del bloque de transacción"

¿Fue útil?

Solución

He acabo de probar y "vacío" hace honor a "statement_timeout". Programa de ejemplo:

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

Me sale el siguiente error:

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)

Tal vez usted tiene que (temporal) permitir la confirmación automática de su conexión.

Otros consejos

Este error puede ocurrir si el servidor postgres está tomando mucho tiempo para cargar es decir, si los datos para una consulta en particular, su es así que muchos de los resultados, se necesitará tiempo para cargar y que van a lanzar esta excepción.

No creo que hay una manera buena (es decir seguro) para matar el proceso que no sea volver a iniciar la base de datos. No estoy al tanto de cualquier opción de espera de transacción tampoco.

La mejor solución es averiguar qué está causando la caída y la fijación de ese problema. Es probable que el vacío está esperando un bloqueo de transacción para ser de liberación. Utilice la vista pg_locks para ver si este es el caso. Si puede ver qué recurso está siendo bloqueado, puede empezar a abordar esta cuestión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top