Spring-引导数据源提交问题

Spring-boot datasource commit trouble

我的应用程序使用 Spring-Boot 1.4.1.RELEASE 我的数据源配置如下;

spring:
  datasource:
    url: ***
    username: ***
    password: ***
    driver-class-name: oracle.jdbc.driver.OracleDriver
    initial-size: 1
    max-active: 100
    max-idle: 30
    min-idle: 1
    max-wait: 0
    pool-prepared-statements: true
    max-open-prepared-statements: 3

问题是我的集成测试的最后一个案例如果其中包含 @Sql 设置逻辑,则无法提交最后一个设置 SQL。由于案例的重新排序,以及只有少数案例具有准备数据库的设置逻辑,问题很少发生。除了 OracleDB 的配置外,没有其他配置,那是在 ConfigClass.

@SpringBootTest(classes = ConfigClass.class)
public class EtcTest {

    @After
    public void teardown() {
        // teardwon X, Y, & Z
    }

    @Test
    @Sql("setupX.sql")
    @Sql("setupY.sql")
    @Sql("setupZ.sql")
    public void get_fromDb() {
        List<Etc> list = buildExpectedList();
        Obj expected = buildExpected();
        Obj actual = getCallToAPI();

        assertThat(rs.getX()).isEqualTo(expected.getX());
        assertThat(rs.getY()).isEqualTo(expected.getY());
        assertThat(rs.getZ()).containsAll(list);
    }
}

麻烦,比如上面的case如果是最后一个集成case, 它未能提交@Sql注释中的最后一个SQL,即SetupZ.sql,但数据并没有完全丢失,它插入了主键,有时columnA,还是columnB,好像真的哪里不对。

某些配置的存在或不存在会导致这种情况吗?如果不是,那是什么原因?

您好,测试 类 您可以使用内存数据库,如 DB2、derby 和 h2,而不是实际的数据库。它为您提供了解决方案。

您可以在下面找到代码示例 URL

您可以尝试使用 JPA 进行持久化。以下设置可用:

spring.jpa.show-sql=true

然后你就可以看到哪里出了问题。

您可以使用 @Transactional 测试。这允许您 运行 测试检查结果并将 BD 回滚到测试前状态。

引用http://docs.spring.io/spring/docs/4.3.11.RELEASE/spring-framework-reference/htmlsingle#testcontext-tx-enabling-transactions

这是由于 JUnit 和 Spring/Hibernate 中的某些库存在冲突。更新到最新的 Spring 和 Junit 版本并更新到 Java8 后,问题就消失了。