@Scheduled(cron = "${trackingdetailspurge.cron.expression}")
void oldRecordPurgeDailyCron() {
List<TrackingEvent> listTrackingEvent = trackingEventDao.findByEventDate(450, "AUDIT_EVENT");
logger.info("--Before Tracking_event purge execution | no of records :"+listTrackingEvent.size());
trackingEventDao.deleteInBatch(listTrackingEvent);
logger.info("Tracking event purge completed | no of records :"+listTrackingEvent.size()+" | "+listTrackingEvent.get(0).getId());
List<Tracking> listTracking = trackingDao.findByUpdateDate(450);}
}
<小时/>
这就是我到目前为止正在做的事情。
它给出了 stackoverflow 错误。我正在尝试删除 100 万条记录。
最佳答案
在我看来,如果您尝试删除这么多记录,那么我建议将列表分成偶数组,并迭代删除这些组,每个组都有自己单独的事务。
因此,您可以计算批处理中的最大实体,而不会导致 StackOverflow 并以最快的速度进行处理。此外,您不会阻止其他事务太长时间,这可能是需要考虑的重要一点。
1) 创建一个始终在新的独立事务中运行的服务方法:
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void deleteEventsInBatch(List<TrackingEvent events){
trackingEventDao.deleteInBatch(events);
}
2) 更改您的预定方法以拆分原始列表并循环调用上述服务方法。
现在,您可以保留计数器并在每次成功的服务调用后更新它。如果其中一项失败,则计数器值将保存到目前为止已删除的行。
关于java - 如何使用jpaRepository的deleteInBatch方法获取已删除行的记录数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43821990/