Spring-boot 数据源提交问题

Posted

技术标签:

【中文标题】Spring-boot 数据源提交问题【英文标题】:Spring-boot datasource commit trouble 【发布时间】: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 方法。 【参考方案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 后,问题就消失了。

【讨论】:

以上是关于Spring-boot 数据源提交问题的主要内容,如果未能解决你的问题,请参考以下文章

Spring-Boot Thymeleaf 绑定枚举在隐藏字段

spring-boot 接收form表单 多文件加多字段数据(postman在form-data格式下传数组和集合)

spring-boot:数据库中断后jdbc重新连接

没有数据源的spring-boot应用程序

Spring-boot数据mongoDB查询嵌套列表

使用spring-boot在多个数据库之间进行数据迁移