Вопрос

Я пытаюсь пылесосить свою базу данных Postgres, выполнив следующую инструкцию SQL в Java:

Вакуумный словесный анализ

Иногда кажется, что это просто «висеть», есть ли чистый способ прервать процесс? я пытался

SET atement_timeout в xxxx

Но я получаю сообщение об ошибке "Vaccum не может работать внутри блока транзакций"

Это было полезно?

Решение

Я только что тестировал, и «вакуум» действительно чтит ». Пример программы:

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

Я получаю следующую ошибку:

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)

Может быть, вам нужно (временно) включить AutoCommit на вашем соединении.

Другие советы

Эта ошибка может возникнуть, если Postgres Server займет столько времени для загрузки данных, т.е. Если для конкретного запроса, это так много результатов, потребуется время, чтобы загрузить это и бросить это исключение.

Я не думаю, что есть хороший (т.е. безопасный) способ убить процесс, кроме как запустить базу данных. Я также не знаю какую -либо вариант тайм -аута транзакции.

Лучшее решение - выяснить, что вызывает варку и решает эту проблему. Вполне вероятно, что вакуум ждет выброса блокировки транзакций. Использовать pg_locks Просмотр, чтобы увидеть, так ли это. Если вы можете увидеть, какой ресурс заблокирован, вы можете начать решать эту проблему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top