如何使用jpaRepository的deleteInBatch方法获取已删除行的记录计数

时间:2017-05-06 15:07:40

标签: java spring spring-boot spring-data spring-data-jpa

@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万条记录。

1 个答案:

答案 0 :(得分:1)

在我看来,如果你试图删除这么多记录,那么我会建议在偶数组中拆分列表并迭代删除这些组,每个组都在自己独立的事务中。

由于您可以计算批处理中的最大实体不会导致StackOverflow并以最快的速度处理。此外,您不会长时间阻止其他交易,这可能是一个需要考虑的重点。

1)创建一个始终在新的独立事务中运行的服务方法:

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void deleteEventsInBatch(List<TrackingEvent events){
    trackingEventDao.deleteInBatch(events);
}

2)更改您的预定方法以拆分原始列表并在循环中调用上述服务方法。

现在,您可以保留计数器并在每次成功的服务呼叫后更新它。如果其中一个失败,则计数器值将保留已删除的行到目前为止。