如何在spring boot jdbc中从具有批量大小的多个表中执行批量删除

Posted

技术标签:

【中文标题】如何在spring boot jdbc中从具有批量大小的多个表中执行批量删除【英文标题】:How to execute batch delete from multiple tables with batch size in spring boot jdbc 【发布时间】:2021-02-20 05:02:43 【问题描述】:

我想从 6 个表中删除,它们有数百万条记录。所以我想批量删除。目前我使用jdbcTemplate.batchUpdate(deleteQueryArray)

这有时可能会导致死锁,所以我想批量删除大小为 x 的大小,这样可以很好地扩展。

查询:

DELETE FROM BATCH_STEP_EXECUTION_CONTEXT 
WHERE STEP_EXECUTION_ID IN (SELECT BE.STEP_EXECUTION_ID 
                            FROM BATCH_STEP_EXECUTION BE 
                            JOIN BATCH_STEP_EXECUTION_CONTEXT BEC ON BE.STEP_EXECUTION_ID = BEC.STEP_EXECUTION_ID  
                            WHERE LAST_UPDATED < '2020-11-01 00:00:00'), 

DELETE FROM BATCH_STEP_EXECUTION 
WHERE JOB_EXECUTION_ID IN (SELECT JOB_EXECUTION_ID 
                           FROM BATCH_JOB_EXECUTION 
                           WHERE LAST_UPDATED < '2020-11-01 00:00:00'), 

DELETE FROM BATCH_JOB_EXECUTION_PARAMS 
WHERE JOB_EXECUTION_ID IN (SELECT JOB_EXECUTION_ID 
                           FROM BATCH_JOB_EXECUTION  
                           WHERE LAST_UPDATED < '2020-11-01 00:00:00')

DELETE FROM BATCH_JOB_EXECUTION 
WHERE LAST_UPDATED < '2020-11-01 00:00:00'

DELETE FROM BATCH_JOB_INSTANCE 
WHERE JOB_INSTANCE_ID NOT IN (SELECT JOB_INSTANCE_ID 
                              FROM BATCH_JOB_EXECUTION)

所以,我看到了两种方法。

    从符合删除条件的作业执行中找到最大作业 ID,然后将其除以假设因子 10 并循环 10 次以从 6 个表(作业执行和相应的子表步骤记录)中删除。使用相同的批量更新

    使用每个表中的 spring 批量更新使用批量选项来删除并为 Spring 批量提供批量大小以进行批量删除。我认为这种方法会比方法 1 花费更多时间。

有人可以分享您的想法吗?这里最好的方法是什么 谢谢

【问题讨论】:

为什么会导致死锁?您是否在单个事务中运行这些查询? 【参考方案1】:

我们在每个计费周期后都有数百万条数据,并且有一个 sql 过程,其中包含所有带有 FK 引用的表并在 for 循环中迭代。这是由一个单独的作业调用的。我认为这种情况下的解决方案应该基于业务运营活动以及需要执行的频率。

【讨论】:

这需要每天执行一次。这是对旧数据的例行清除操作。

以上是关于如何在spring boot jdbc中从具有批量大小的多个表中执行批量删除的主要内容,如果未能解决你的问题,请参考以下文章

如何在具有 JDBC 安全性的 Spring Boot 中使用 Flyway?

如何在 Spring Boot 中从双向表关系生成 DTO

Spring Boot MySQL 不批量插入

如何在apache中从角度调用spring boot api

如何在 Spring Boot 中从 mongodb 更改 geojson (GeoJsonPolygon) 的编组?

如何在spring boot中从restful控制器返回一个html页面?