如何正确清理Spring管理的ShedLock表中的记录?
ShedLock 记录清理的正确方式
启用自动过期清理(推荐)
ShedLock本身支持自动清理过期锁记录,无需手动执行TRUNCATE。在Spring Boot配置中添加以下参数即可:# 每10分钟执行一次过期记录清理 shedlock.cleanup.interval=PT10M # 锁的最大持有时长,超过该时间的记录会被判定为过期 shedlock.lock-at-most-for=PT5M其中
PT10M是ISO-8601时间格式,代表10分钟,可根据业务需求调整时长。开启后,ShedLock会自动维护表内记录,不会出现清理后需重启应用的问题。手动触发清理API
如果需要主动清理而非等待定时任务,可以注入LockProvider实例,调用其自带的cleanUp()方法。示例代码:@Autowired private LockProvider lockProvider; public void cleanExpiredShedLocks() { if (lockProvider instanceof JdbcTemplateLockProvider) { ((JdbcTemplateLockProvider) lockProvider).cleanUp(); } }这个方法只会删除已过期的锁记录,不会影响当前有效的锁,执行后新的锁记录能正常插入,无需重启应用。
为何TRUNCATE后需重启?
直接用TRUNCATE清空表时,ShedLock内部的缓存或状态未同步更新,后续尝试获取锁时会误判锁仍存在,因此不会插入新记录。而使用自带清理方法时,会同时更新内部状态,避免该问题。注意事项
- 禁止全量执行
TRUNCATE或DELETE FROM shedlock,除非所有应用实例已停止,否则会导致分布式锁失效。 lock-at-most-for的配置需合理,既要避免死锁,又不能短于任务实际执行时长。
- 禁止全量执行
内容的提问来源于stack exchange,提问作者L.r. Sharma
相关产品推荐
相关产品推荐

