2017-05-06 28 views
1
的deleteInBatch方法
@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);} 
} 

這是我到目前爲止做的獲取刪除行的記錄數。如何使用jpaRepository

這是給stackoverflow錯誤。它是我想要刪除的100萬條記錄。

回答

1

在我看來,如果你試圖刪除這麼多的記錄,那麼我會建議在甚至組中分割列表並迭代地刪除這些組,每個都在它自己的單獨事務中。

感謝您可以計算批次中的最大實體不會導致StackOverflow並以最快的速度處理。你也不會阻止其他交易太長時間,這可能是一個重要的考慮點。

1)創造條件,始終在一個新的,獨立的事務運行的服務的方法:

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

2)更改計劃的方法來分割原始列表,並調用上述服務方法在一個循環中。

現在您可以保留計數器並在每次成功服務調用後對其進行更新。如果其中一個失敗,那麼計數器值將保存已刪除的行。

+0

好的很多。我也想問一下如何獲得刪除的記錄數。 –

+0

我也包含了關於如何做到這一點的想法 –

+0

它正在爲2000年左右的記錄工作,沒有分裂..但是對於更多的記錄它給'套接字關閉'異常..所以是分裂的唯一方式? –

0

除非要刪除的記錄在刪除之前需要詳細檢查,否則無需在內存中提取記錄以刪除它們並找到已刪除記錄的數量。下面應該工作:

interface TrackingEventRepository extends CrudRepository<TrackingEvent, Long> { 
    @Modifying 
    @Query("delete from TrackingEvent e where e.date = ?1") 
    @Transactional 
    int deleteByEventDate(int date); 
} 

上述方法庫可以被調用爲trackingEventRepository.deleteByEventDate(450),將直接從數據庫中刪除所需的記錄沒有它們加載到內存中。該方法的返回值將指示受查詢影響的記錄數,在這種情況下將是已刪除記錄的數量。

A sample project在Github上可用以證明這一點。

相關問題