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。所有连接池特定设置都已移至专用命名空间。检查您的配置。 @StephaneNicoll 我一直在使用相同的版本,唯一的变化是我添加了一些设置和拆卸方法,这些方法用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 绑定枚举在隐藏字段