我正在使用Sprind Data JPA / Hibernate作为持久层运行SpringBoot 2.1。在关闭应用程序之前,在测试中成功运行查询时遇到了问题。
细节:
在应用程序上下文启动期间,我正在通过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
executes 注释,但是当查询由H2执行(我的弹簧测试中运行的内存db)时,它抛出异常,表明该表不存在。
事实是该表肯定存在,因为我能够在应用程序启动期间在该表上执行INSERT(请参阅文章开头)。
我的猜测是shudtown进程正在进行中,因此内存数据库被清除了……因此没有表。
无论如何,有什么方法可以确保在与数据库的连接仍然健康且没有删除表时(在应用程序上下文关闭时)执行查询?
我设法通过使用DB_CLOSE_ON_EXIT=FALSE";
init参数克服了这个问题
String url = "jdbc:h2:~/test;DB_CLOSE_ON_EXIT=FALSE";
在这种情况下,H2不会杀死数据库,并在关闭过程中使其保持可用状态。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句