sql - 如何进行频繁提交,以便我的 sql 删除查询不会超时
问题描述
我有几个更新/删除查询作为我的 Spring Batch 项目中各个任务的一部分,这些查询正在超时,因为它们正在删除大量记录。由于这些只是更新和删除查询,我将它们实现为不是面向块的 Tasklet 步骤。
我怎样才能频繁提交以避免超时。
public class DeleteTask implements Tasklet {
private static final String DELETE_QUERY = "DELETE FROM MYTABLE WHERE COLUMN = 'TEST'";
private JdbcTemplate jdbcTemplate;
public DeleteTask(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) {
log.info("Purging IMCO records from MYTABLE table...");
try {
jdbcTemplate.update(DELETE_QUERY);
} catch (Exception e) {
log.info("Failed to purge records from MYTABLE table due to:");
log.info(e.getMessage());
}
log.info("Records purged");
return RepeatStatus.FINISHED;
}
}
编辑:异常状态:
StatementCallback; SQL [DELETE FROM MYTABLE WHERE LOB_CD = 'TEST'[jcc][t4][2055][11259][4.14.113] The database manager is not able to accept new requests, has terminated all requests in progress,
ERRORCODE=-4499, SQLSTATE=58009; nested exception is com.ibm.db2.jcc.am.DisconnectNonTransientException: [jcc][t4][2055][11259][4.14.113] The database manager is not able to accept new requests, has terminated all requests in progress,
解决方案
一个简单的 SQL 复合语句可能是最好的方法
BEGIN
DECLARE DONE BOOLEAN DEFAULT FALSE;
--
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' BEGIN SET DONE = TRUE; END;
--
WHILE NOT DONE
DO
DELETE FROM (SELECT * FROM MY_TABLE WHERE COL1 = 'A' FETCH FIRST 20000 ROWS ONLY)
COMMIT;
END WHILE;
END
推荐阅读
- mongodb - 如何在 MongoDB 中检查字段是否持续增加
- protocol-buffers - 为什么 protobuf 更喜欢代码生成器而不是运行时动态加载
- java - 难以将外观和感觉整合到我的项目中
- python - 仅在 Pandas 中将日期时间格式更改为小时
- javascript - 在 Shopify 中创建自定义数据以保存到客户对象中并在不同页面上访问
- c++ - C++ 命名空间在 Windows 和 linux 中的行为是否不同?
- r-markdown - [方括号]中的R-Markdown下标
- python - 当列值是另一个数据框的列名时的数据框操作
- javascript - 按下按钮后动态添加新文本框不起作用 - Angular
- token - 在我的 BEP20 Token 代码中使用 import 语句会影响我的未来吗?