java - 使用连接池进行 Spring Boot 和数据库测试

标签 java database spring spring-boot connection-pooling

我正在尝试为连接到数据库的应用程序创建测试。 DataSource 是一个连接池 (Hikari)。

这是我的测试配置:

@Configuration
public class SqlTestConfig {

    @Bean
    DataSource dataSource() {
        HikariConfig config = new HikariConfig();
        config.setMaximumPoolSize(2);
        config.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        config.setJdbcUrl("jdbc:sqlserver://serversql:1433;database=myDatabase");
        config.setUsername("user");
        config.setPassword("password");
        return new HikariDataSource(config);
    }
}

这是我的测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = SqlTestConfig.class)
@Slf4j
@Sql(
        scripts = "/clearTables.sql",
        config = @SqlConfig(separator = "GO")
)
public class SqlTest {

    @Autowired
    DataSource dataSource;

    @Test
    public void test1() throws SQLException {
        log.info("catalog:" + dataSource.getConnection().getCatalog());
    }

    @Test
    public void test2() throws SQLException {
        log.info("catalog:" + dataSource.getConnection().getCatalog());
    }

    @Test
    public void test3() throws SQLException {
        log.info("catalog:" + dataSource.getConnection().getCatalog());
    }

    @Test
    public void test4() throws SQLException {
        log.info("catalog:" + dataSource.getConnection().getCatalog());
    }
}

请注意,MaximumPoolSize 设置为 2。当我运行测试类时,前两个测试成功完成,其余测试失败,因为池中的连接耗尽(连​​接超时)。

我认为问题是因为 @Sql 注释导致创建 DataSourceInitializer -s 以执行清理脚本,但连接永远不会返回到池中。

当我将 MaximumPoolSize 设置为 4 时,所有测试都已成功完成。我不知道我是否犯了配置错误,或者这是 Spring 中的错误。

最佳答案

getConnection 从底层池获取连接。更改您的测试以正确关闭获取的连接,如下所示:

@Test
public void test1() throws SQLException {
    try (Connection connection = dataSource.getConnection()) {
        log.info("catalog:" + connection.getCatalog());
    }
}

关于java - 使用连接池进行 Spring Boot 和数据库测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39246795/

相关文章:

java - 在没有 Spring Boot 的情况下运行 Spring Shell 2

java - 在 Spring 的情况下,我应该继承什么类来创建数据库集成测试?

java - 发送邮件时出错

android - Android数据库;解决最后几个错误

mysql - 在一个表中定义多个多对多关系

mysql - 当我无法创建新的 MySQL 用户时,如何让某人只能访问某些 MySQL 表?

java - ItemProcessor 的 Spring Batch 瓶颈

java - 有没有办法让 javadoc 工具记录注释?

java - 如何在 spring webflux/webclient 中有条件地链接 webclient 调用

java - Unix 脚本中的 JSTAT 无法正常工作