我的情況:如何在spring批處理中使用itemWriter編寫子記錄
我有我從readerItem中的db讀取的類A.然後我需要處理這個類A,並在itemProcessor中創建類B。最後,我將這個B類保存到itemWriter中的db中。
問題:在處理過程中,我還需要創建具有B類外鍵的C類(約1 mil記錄)並保存該類C.我應該如何執行此操作。
我不能這樣做: 因爲正如我寫的,我有大約1萬個記錄,我應該需要在內存中存儲什麼是大約2GB的空間。那麼我應該如何解決這個問題。
public class BWriter extends BaseItemWriter<B> {
public void write(List<? extends B> data) throws Exception {
logger.info("Start writing: " + data);
for (B item : data) {
myCustomDao.saveB(item);
for (C itemC : item.getC()) {
itemC.setB(item);
myCustomDao.saveC(itemC);
}
}
}
}
UPDATE:
可能的解決方案,其犯規包括彈簧批次,我想:
List<C> cList = new ArrayList<C>();
int i = 0;
String line;
while ((line = reader.readLine()) != null) {
String[] data = line.split(";");
if (data.length > 1 && !StringUtils.isBlank(data[1])) {
C cItem = new C();
cItem.set(...);
cList.add(i, cItem);
if (++i >= 1000) {
myCustomDao.save(cList);
cList = new ArrayList<C>();
i = 0;
}
}
}
if (!cList.isEmpty())
myCustomDao.save(cList);
'B.getC()':它會返回一個迭代器嗎?你可以發佈'B'的代碼嗎? – bpgergo
它返回C項的列表 – hudi
但每個B有1mil C? –