【问题标题】:testcontainers, hikari and Failed to validate connection org.postgresql.jdbc.PgConnectiontestcontainers, hikari 和 Failed to validate connection org.postgresql.jdbc.PgConnection
【发布时间】:2020-04-09 19:50:53
【问题描述】:

我有一个 Spring Boot 应用程序。我正在使用 testcontainers 对其进行测试,以确保 DB (postgres) 和 Repository 实现执行它们应该执行的操作。

我使用以下内容初始化容器并且效果很好。

    @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 中设置hikari 属性,如"spring.datasource.hikari.maxLifetime=1""spring.datasource.hikari.idleTimeout=1",但没有任何运气。

有什么建议吗?

谢谢

【问题讨论】:

  • 你最终找到答案了吗?
  • 不,我没有? ☹️

标签: java spring-boot hikaricp testcontainers


【解决方案1】:

我遇到了完全相同的问题:单独运行测试通过,但与其他测试一起运行时失败。

我发现 SpringBootTest 在测试之间重用了 Spring 上下文,所以测试之间有一个共同的 Hikari 池。但是在后台 testcontainers 杀死(在上一次测试之后)一个容器并创建了一个新容器(在下一次测试之前)。 SpringBootTest 不知道导致新 Postgres 容器的更改,因此 Hikari Pool 与之前的测试相同(指向已使用且当前不可用的端口)

在我的情况下,添加 @DirtiesContext 注释来测试会有所帮助。

【讨论】:

    【解决方案2】:

    我在问题中遇到了同样的问题,发现设置集成测试的 hikari 连接超时有助于避免延迟。

    spring:
      datasource:
        hikari:
          connection-timeout: 250
    

    【讨论】:

      【解决方案3】:

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 1970-01-01
      • 2017-07-30
      • 2016-01-21
      • 2013-02-07
      • 1970-01-01
      • 2015-08-04
      • 2020-11-30
      • 2018-10-05
      • 2015-04-24
      相关资源
      最近更新 更多