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

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

最佳答案

在我看来,如果您尝试删除这么多记录,那么我建议将列表分成偶数组,并迭代删除这些组,每个组都有自己单独的事务。

因此,您可以计算批处理中的最大实体,而不会导致 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/

相关文章:

java - 为什么我不能在 Java 8 lambda 表达式中抛出异常?

java - Spring Security AnonymousAuthFilter 与 PreAuthenticationFilter 允许未经授权的请求

java - 如何使用 HTTPServletRequest 在 spring 中读取请求参数值

java - Intellij IDEA : specify datasource for JPA validation

java - 如何为相互 SSL 覆盖 Spring boot keystore /信任库

java - 确定 Java 中的有效日期

java - 有没有办法让圆圈从可移动物体的顶部反弹?

JAVA:仅当在 JTextField 中进行更改时才启用 JButton

java - 无法调试 Spring Boot 应用程序。断点总是会逃逸

hibernate - 如何通过 Spring Data JPA 知道底层数据库名称