當通過「數據提供者」進行流式處理時,我需要在數據庫中插入相當多的實體,例如大約100.000。這整個步驟需要是事務性的。
爲了簡化我的用例,儘可能讓我們假設這是我的代碼:插入大量行而不將實體附加到持久性上下文
@Transactional
public void execute() {
for (int i = 0; i < 100000; i++) {
carRespository.save(new Car());
}
}
這段代碼的問題是,即使很清楚我有沒有用在汽車實體後插入查詢生成的實體附加到持久性上下文並保存在內存中,直到事務完成。
我想確保在垃圾收集被觸發的情況下,創建的實體被清除。對於這個目前我看到了兩個解決方案:
- 在存儲庫中創建一個本地插入查詢
- 注入
EntityManager
在服務和呼叫後,每em.detach(car)
插入
我傾向於選擇第二個選項因爲我不需要在實體更改時管理本機插入語句。
你能確認我採取了正確的做法還是建議一個更好的選擇。
這將是實施的「純」休眠方式我第二個建議(帶分離的一個)。我承認你的建議是「偶爾一次」清除實體。我也可以用'em.clear()'來實現這一點。 – mvlupan