@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万条记录。
答案 0 :(得分:1)
在我看来,如果你试图删除这么多记录,那么我会建议在偶数组中拆分列表并迭代删除这些组,每个组都在自己独立的事务中。
由于您可以计算批处理中的最大实体不会导致StackOverflow并以最快的速度处理。此外,您不会长时间阻止其他交易,这可能是一个需要考虑的重点。
1)创建一个始终在新的独立事务中运行的服务方法:
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void deleteEventsInBatch(List<TrackingEvent events){
trackingEventDao.deleteInBatch(events);
}
2)更改您的预定方法以拆分原始列表并在循环中调用上述服务方法。
现在,您可以保留计数器并在每次成功的服务呼叫后更新它。如果其中一个失败,则计数器值将保留已删除的行到目前为止。