【问题标题】:Spring-boot datasource commit troubleSpring-boot 数据源提交问题
【发布时间】:2017-07-23 05:49:27
【问题描述】:

我的应用使用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);
    }
}

麻烦,例如在上面的案例中,如果它是最后一个集成案例, 就是没有提交@Sql注解的最后一条SQL,即SetupZ.sql,但是数据并没有完全丢失,插入主键,有时columnA,或者columnB,就好像什么这里真的错了。

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

【问题讨论】:

  • 如果您使用自动配置,您应该在升级时阅读the release note,尤其是this section。所有连接池特定设置都已移至专用命名空间。检查您的配置。
  • @StephaneNic​​oll 我一直在使用相同的版本,唯一的变化是我添加了一些设置和拆卸方法,这些方法用junit的前后注释进行了注释。上次我成功构建了,当时构建以某种方式在最后放置了一个与数据库无关的测试,现在我再次遇到与最后一个案例相同的非提交问题。
  • 对于 Oracle 9i 及更高版本,您应该使用 oracle.jdbc.OracleDriver 而不是 oracle.jdbc.driver.OracleDriver,因为 Oracle 已经声明 oracle.jdbc.driver.OracleDriver 已弃用。
  • 你使用的是 java 8 吗?
  • 您是否尝试过测试@Transactional ??如果可能的话,引入具有相同@SQL 注释的@Before 方法。

标签: java spring-boot datasource


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您好,对于测试类而不是实际数据库,您可以使用 DB2、derby 和 h2 等 In-Memory 数据库。它为您的麻烦提供了解决方案。

    对于代码示例,您可以在下面的 URL 中找到 Spring data jpa repository In-memory test case

    【讨论】:

      【解决方案3】:

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

      spring.jpa.show-sql=true
      

      然后你就可以看到出了什么问题。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2020-01-15
          • 2023-03-20
          • 2023-03-14
          • 2019-02-14
          • 1970-01-01
          • 2019-01-08
          • 1970-01-01
          • 2019-10-23
          相关资源
          最近更新 更多