如何解决当调用长期运行的findAll存储库方法
我有带有Spring Data的Spring Boot 2应用程序。这是数据库连接定义:
spring.datasource.url=jdbc:oracle:thin:@XXX:9555:YYY
spring.datasource.username=uname
spring.datasource.password=pwd
spring.datasource.hikari.connection-test-query=SELECT 1 FROM DUAL
spring.datasource.hikari.minimum-idle=1
spring.datasource.hikari.maximum-pool-size=5
spring.datasource.hikari.pool-name=pool
@Async
@Scheduled(cron = "${calculate.cron}")
public void calculate() {
try {
if (syncInstancesForTaskExecution()) {
calculatorService.calculate();
// Remove task start execution DT
instanceSyncService.setTaskLastExecutionDt(null);
}
} catch (Exception e) {
logger.error("Scheduled task Failed",e);
}
public void calculateRequests() {
logger.trace("Task deleting old data");
calculatedRepository.deleteall();
logger.trace("Task deleted old data");
logger.trace("Task selecting new data");
Iterable<ServiceRequestView> srv = viewRepository.findAll();
logger.trace("Task selected new data");
...
排定的作业背后的逻辑是,该作业基本上每晚运行,从表(calculatedRepository.deleteall()
)中删除旧数据,从数据库视图(viewRepository.findAll()
)中选择新数据,然后保存表中的新数据。
我遇到的问题是,有时在调用viewRepository.findAll()
之后执行挂起。在数据库上,我们可以看到选择已被调用并执行。就我而言,现在看来,如果执行选择操作所需的时间少于1小时,那么一切正常;如果执行选择过程所需的时间超过1小时,则问题就出现了。
日志中没有任何错误,我唯一能看到的是,在调用findAll()
之后停止记录,并且永远不会下一个日志行(logger.trace("Task selected new data")
)打印。我还可以看到,没有执行数据库更新,因此不仅记录不起作用,而且看起来整个任务执行都停止/结束。
您知道这可能导致此问题吗?数据源,光池,预定作业还是什么?我找不到原因。
编辑:
我已经按照M. Deinum的建议更新了代码-实现了DELETE FROM table
和INSERT INTO ...
,但问题仍然存在。 INSERT INTO ...
查询在1小时2分钟后执行,但表中未插入任何内容,并且日志再次看起来相同。 :(
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。