当调用长期运行的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

然后我有一个cron计划的作业,定义如下:

@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);
    }

这是CalculatorService中的计算方法

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 tableINSERT INTO ...,但问题仍然存在。 INSERT INTO ...查询在1小时2分钟后执行,但表中未插入任何内容,并且日志再次看起来相同。 :(

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...