【发布时间】:2019-08-15 23:38:47
【问题描述】:
我正在运行 SpringBoot 2.1,并使用 Sprind Data JPA/Hibernate 作为持久层。在应用程序关闭之前,在我的测试中,我遇到了成功运行查询的问题。
详情:
在应用程序上下文启动期间,我正在通过 JPA 执行查询(假设此查询转换为遵循 SQL "insert into mytable('mycolumn') values ('abc'))。
现在我需要在应用程序关闭之前执行另一个查询。对于给定的示例,这将是 "update mytable set mycolumn = 'xyz' where mycolumn = 'abc'
我设法通过在我的配置类上使用 @PreDestroy 来执行查询
@Configuration
MyConfig {
@Autowired
private MyTransactionalService myService;
@PreDestroy
public void doQuery() {
mySerivce.runMyQuery();
}
}
mySerivce.runMyQuery() 委托给myRepository(即 Spring Data JPA 存储库)调用更新查询:
MyRepository extends JpaRepository(String, Something) {
@Modifying
@Query("UPDATE myEntity e SET e.myColumn = 'xyz' WHERE e.myColumn = 'abc")'
void runMyQuery();
}
使用@PreDestroy 注释的方法会执行,但是当查询由 H2(在我的 spring 测试中运行的内存数据库)执行时,它会抛出异常,说明该表不存在。
问题是该表之前肯定存在,因为我能够在应用程序启动期间对该表执行 INSERT(请参阅帖子的开头)。
我的猜测是 shudtown 进程正在进行中,所以内存数据库被清除了......因此没有表。
是否有办法确保在与数据库的连接仍然正常且尚未删除表的情况下执行查询(在应用程序上下文关闭时)?
【问题讨论】:
-
为什么需要在数据库销毁之前更新表?
-
在测试中这被破坏了。在实时系统中,数据库将是持久的。对于真正的数据库(SQL 服务器),我真的需要它......但我希望能够在测试中使用 in-mem db 测试这种行为
标签: spring spring-boot spring-data-jpa shutdown-hook application-shutdown