testcontainers、hikari 和无法验证连接 org.postgresql.jdbc.PgConnection

问题描述 投票:0回答:4

我有一个 Spring Boot 应用程序。我正在使用 testcontainers 对其进行测试,以确保数据库(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
中设置hikari属性,例如
"spring.datasource.hikari.maxLifetime=1"
"spring.datasource.hikari.idleTimeout=1"
,但没有任何运气。

有什么建议吗?

谢谢你

java spring-boot hikaricp testcontainers
4个回答
16
投票

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

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

就我而言,添加

@DirtiesContext
注释来测试有帮助。


0
投票

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

spring:
  datasource:
    hikari:
      connection-timeout: 250

0
投票

我遇到了完全相同的问题,并注意到我也有

spring.jpa.hibernate.ddl-auto=create-drop

我将其更改为

create
,因为Ryuk-container将删除Postgres-Container,所以我们不需要删除我们的数据库。而且不使用
@DirtiesContext
也有帮助。


-1
投票

尝试其他池

1:Tomcat-jdbc(https://github.com/apache/tomcat/tree/main/modules/jdbc-pool

2:德鲁伊(https://github.com/alibaba/druid

3:BeeCP(https://github.com/Chris2018998/BeeCP),比 HikariCP 更快

© www.soinside.com 2019 - 2024. All rights reserved.