我正在尝试从数据库中选择数据,更新每个对象,然后在项目编写器中更新数据库。
我尝试在每次更新后刷新DAO,但它没有任何改变。
该配置非常基本,读取器,写入器和commmit间隔为100。
读者正在按预期方式工作:
@Override
public Order read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
if(iterator == null) {
List<Order> all = findOrders();
iterator = all.listIterator();
}
if (iterator.hasNext()) {
return iterator.next();
} else {
return null;
}
}
作家也很基础:
public void write(List<? extends Order> items) throws Exception {
@SuppressWarnings("unchecked")
List<Order> listOrder = (List<Order>) items;
try {
for(Order o : listOrder) {
etatCommandeServiceImpl.updateEtatCommande(o);
}
}catch(Exception e) {
if (log.isErrorEnabled()) {
log.error("ERROR {}", e);
}
throw e;
}
}
问题是前100条记录已提交,其余部分未提交。 Spring批处理表显示它读取所有记录并多次提交,但是当我检入数据库时,它只提交一次。
Spring-batch的版本是2.2.6。
更新
我认为这个问题是由于与数据库的事务引起的,因为现在它根本不提交给数据库。但是我暂时无法解决。
答案 0 :(得分:1)
问题是您要从ItemReader返回null。如果您返回null,Spring批处理将假定已到达Feed的结尾,并且它将终止作业。由于在每个块(在您的情况下为100)之后都返回null,因此在处理100条记录后Sprint批处理将终止。
请使用@PostConstruct创建方法,并获取要处理的所有记录,并将ItemReader更改为一次返回1,并在读取所有记录时为null。