微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当调用长期运行的findAll存储库方法

如何解决当调用长期运行的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 举报,一经查实,本站将立刻删除。