Docker пауза в базе данных пусть оператор висит вечно - PullRequest
0 голосов
/ 19 июня 2020

У меня есть база данных PostgreSQL, запущенная на docker, и я хочу проверить способность моей системы java обрабатывать с ней проблемы с подключением. Я тестирую свою службу java в двух разных сценариях ios: останавливая контейнер (docker stop postgresContainer) и приостанавливая его (docker pause postgresContainer)

Когда я останавливаю контейнер, JDB C быстро выдает исключение, которое я могу перехватить и обработать, но когда я приостанавливаю, служба попадает в заблокированное состояние, которое оператор JDB C зависает при выполнении навсегда, пока контейнер не будет "не приостановлен", когда поток метода вернется и выполняются отложенные операторы.

Я также заметил, что когда я получаю статус подключения JDB C, вызывая connection.isValid(1);, он тоже здесь навсегда зависает.

public void executeStatement(String query) {
    try {
            Connection connection = getConnection();
            Statement statement = connection.createStatement();
            // It gets stuck here forever when the container is "paused"
            // When I unpause, the query to be executed is persisted in DB
            statement.execute(query);

            statement.close();
            connection.close();
    }
        catch (Exception e) {
            statement.close();
            connection.close();
        }

Ответы [ 2 ]

1 голос
/ 19 июня 2020

См. https://jdbc.postgresql.org/documentation/head/connect.html

Особенно:

connectTimeout = int

Значение тайм-аута, используемое для операций подключения к сокету. Если соединение с сервером занимает больше времени, чем это значение, соединение разрывается. Тайм-аут указывается в секундах, и нулевое значение означает, что он отключен.

socketTimeout = int

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

0 голосов
/ 24 июня 2020

В моем конкретном случае c я мог бы решить эту проблему, добавив тайм-аут соединения и тайм-аут получения соединения.

Чтобы установить тайм-аут сети, я вызвал connection.setNetworkTimeout(null, timeoutInSeconds * 1000);. Я не смог использовать его, потому что моя версия драйвера postgres была слишком старой

Чтобы установить тайм-аут получения соединения (я использую c3p0 для обработки пула соединений), я добавил следующий вызов при создании Экземпляр ComboPooledDataSource c3p0ConnectionPool.setCheckoutTimeout(checkoutTimeout);

...