我的情况:
我在readerItem中从db读取了类A。然后我需要处理这个类A并创建我在item处理机中做的类B。最后,我将这个类B保存到itemWriter中的db中。
问题:在处理过程中,我还需要创建具有类B外键的类C(约1 mil记录)并保存该类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);
}
}
}
}
更新:
可能的解决方案不包括我想要的Spring批次:
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);
如果在not a选项中将commit interval
减少到一个较小的值,因为一个B元素最多可以有1mil C对象,您可以这样做:
处理类A到类B,而不在处理的B对象中创建C对象;
在BWriter
中附加一个ItemWriteListener
如果问题是由于使用Hibernate而不是普通的JDBC造成的,您可以考虑手动使用无状态会话或
flush()/clear()
会话;1数据库的mil record不是一个大数字
不幸的是,当您有大量数据时,ORM不是最佳选择。
我的2美分,我和你一样是Spring批的新手。
我正在尝试在没有项目编写器的情况下使用下面的配置来配置spring批处理步骤。然而,我错误地说writer元素既没有'writer'属性,也没有元素。 我浏览了链接spring批处理:没有ItemWriter的Tasklet。但无法解决问题。有人能告诉我在我提到的代码片段中要做的具体更改吗
我有一个假问题。为了解释我的用例,我有不同类型的DAO;比如说啤酒。。。等等,我想用一个通用的ItemWriter来处理所有的问题。我创建了一个,在这里我定义了; 作家班是这样的; 到目前为止一切都还好。事情变得复杂的地方是,我为每个存储库定义了单独的配置类,其中定义了存储库特定的项。例如,为用户插入数据库的步骤。 当我用IJ编写这段代码时,我抱怨
我有一个Spring批导入流程,它有以下步骤: 读取特定格式的文件 保存人员、属性和约会的数据(每个文件行可以表示对多个表进行多次插入) 写入结果文件(主要是读取的结果,但有时我们无法将读取的数据处理成可以连贯插入的内容) 我目前在一组阅读器中有#1(每个文件格式一个),在单个Writer类中有#2和#3。我感觉写入结果文件应该是与将数据写入数据库分开的一个步骤,但我不确定如何做到这一点。 ste
我在没有ItemWriter的情况下定义了我的tasklet,如下所示: 我得到了这个错误: 配置问题:
我有一个简单的Spring批处理作业,包含几个步骤,最后一步是编写报表,所以我有ItemReader、ItemProcessor和ItemWriter。ItemWriter按块编写取决于步骤中定义的块数,但我需要等到获得所有项后再编写最终报告。我怎么能那样做?
我从某个时候起就被这个问题困扰着。 我使用的是spring batch 3.0.7 问题是在ItemWriter中的一个记录中出现org.springframework.dao.DataIntegrityViolationExcue的情况下,组块(组块大小=10)中的其余记录也不会插入到数据库中,即使在提供了skipPolicy之后(对于所有异常返回true)。 我的理解是,如果在提交整个大块时出