testcontainers, hikari и Failed to validate connection org.postgresql.jdbc.PgConnection

У меня есть весеннее загрузочное приложение. Я тестирую его с помощью тестовых контейнеров, чтобы убедиться, что БД (postgres) и реализация репозитория делают то, что они должны делать.

Я инициализирую контейнер следующим образом и работает очень хорошо.

    @Container
    @SuppressWarnings("rawtypes")
    private static final PostgreSQLContainer POSTGRE_SQL = new PostgreSQLContainer("postgres:9.6")
        .withDatabaseName("xxx")
        .withUsername("xxx")
        .withPassword("xxx");

    static class Initialiser implements ApplicationContextInitializer<ConfigurableApplicationContext> {
        @Override
        public void initialize(ConfigurableApplicationContext applicationContext) {
            TestPropertyValues.of(
                "spring.datasource.url=" + POSTGRE_SQL.getJdbcUrl(),
                "spring.datasource.username=" + POSTGRE_SQL.getUsername(),
                "spring.jpa.hibernate.ddl-auto=create-drop"
            ).applyTo(applicationContext.getEnvironment());
        }
    }

Проблема в том, что пока тесты проходят успешно, в конце занятия, когда контейнер выключается, я получаю следующие сообщения об ошибках от hikari

[31mWARN [0;39m [36mcom.zaxxer.hikari.pool.PoolBase.isConnectionAlive[0;39m - HikariPool-1 - Failed to validate connection org.postgresql.jdbc.PgConnection@4d728138 (This connection has been closed.). Possibly consider using a shorter maxLifetime value.
[31mWARN [0;39m [36mcom.zaxxer.hikari.pool.PoolBase.isConnectionAlive[0;39m - HikariPool-1 - Failed to validate connection org.postgresql.jdbc.PgConnection@43070a2e (This connection has been closed.). Possibly consider using a shorter maxLifetime value.
[31mWARN [0;39m [36mcom.zaxxer.hikari.pool.PoolBase.isConnectionAlive[0;39m - HikariPool-1 - Failed to validate connection org.postgresql.jdbc.PgConnection@1aa53837 (This connection has been closed.). Possibly consider using a shorter maxLifetime value.
[31mWARN [0;39m [36mcom.zaxxer.hikari.pool.PoolBase.isConnectionAlive[0;39m - HikariPool-1 - Failed to validate connection org.postgresql.jdbc.PgConnection@3d7cffa2 (This connection has been closed.). Possibly consider using a shorter maxLifetime value.
[31mWARN [0;39m [36mcom.zaxxer.hikari.pool.PoolBase.isConnectionAlive[0;39m - HikariPool-1 - Failed to validate connection org.postgresql.jdbc.PgConnection@634e7d8e (This connection has been closed.). Possibly consider using a shorter maxLifetime value.
[31mWARN [0;39m [36mcom.zaxxer.hikari.pool.PoolBase.isConnectionAlive[0;39m - HikariPool-1 - Failed to validate connection org.postgresql.jdbc.PgConnection@18634db3 (This connection has been closed.). Possibly consider using a shorter maxLifetime value.
[31mWARN [0;39m [36mcom.zaxxer.hikari.pool.PoolBase.isConnectionAlive[0;39m - HikariPool-1 - Failed to validate connection org.postgresql.jdbc.PgConnection@2bb4ba08 (This connection has been closed.). Possibly consider using a shorter maxLifetime value.
[31mWARN [0;39m [36mcom.zaxxer.hikari.pool.PoolBase.isConnectionAlive[0;39m - HikariPool-1 - Failed to validate connection org.postgresql.jdbc.PgConnection@71efd133 (This connection has been closed.). Possibly consider using a shorter maxLifetime value.
[31mWARN [0;39m [36mcom.zaxxer.hikari.pool.PoolBase.isConnectionAlive[0;39m - HikariPool-1 - Failed to validate connection org.postgresql.jdbc.PgConnection@61dd608d (This connection has been closed.). Possibly consider using a shorter maxLifetime value.
[31mWARN [0;39m [36mcom.zaxxer.hikari.pool.PoolBase.isConnectionAlive[0;39m - HikariPool-1 - Failed to validate connection org.postgresql.jdbc.PgConnection@6351b7d0 (This connection has been closed.). Possibly consider using a shorter maxLifetime value.

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

Я пытался играть с настройками свойств хикари в Initialiser, таких как "spring.datasource.hikari.maxLifetime=1" и "spring.datasource.hikari.idleTimeout=1", но безуспешно.

Какие-либо предложения?

Спасибо


person davide    schedule 17.12.2019    source источник
comment
вы нашли ответ в конце концов?   -  person Karmakulov Kirill    schedule 21.12.2020
comment
Нет? ☹️   -  person davide    schedule 21.12.2020


Ответы (1)


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

Я обнаружил, что SpringBootTest повторно использует контекст Spring между тестами, поэтому между тестами существует общий пул Hikari. Но в фоновом режиме testcontainers убили (после предыдущего теста) контейнер и создали новый (перед следующим тестом). SpringBootTest не знает об этом изменении, приводящем к созданию нового контейнера Postgres, поэтому пул Hikari такой же, как и в предыдущем тесте (указывает на уже используемый и в настоящее время недоступный порт).

В моем случае помогло добавление аннотации @DirtiesContext к тесту.

person Marcin Zięba    schedule 29.01.2021