【发布时间】:2013-08-27 09:35:27
【问题描述】:
我的情况:
我有从 readerItem 中的 db 读取的 A 类。然后我需要处理这个类 A 并创建我在 itemProcessor 中做的 B 类。最后,我将这个 B 类保存到 itemWriter 中的 db 中。
问题:在处理过程中,我还需要创建具有 B 类外键的 C 类(大约 100 万条记录)并保存这个 C 类。我应该怎么做。
我不能这样做: 因为正如我写的那样,我有大约 100 万条记录,我需要在内存中存储大约 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);
}
}
}
}
更新:
不包括我想要的春季批次的可能解决方案:
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的代码吗? -
返回C项列表
-
但是每个 B 有 100 万个 C?
-
不,只是其中几个
-
如果你可以在内存中拥有的最大对象数是 (commit-intervalB)+(commit-intervalB*C):没什么大不了的,我认为
标签: java spring-batch