batchSave 和batchUpdate

recordList.forEach(record -> {

    String CASE_NBR = record.getStr("CASE_NBR");

    Material material = cacheService.getMaterialById(CASE_NBR);

    if (material == null) {

        material = new Material()

                .setSpdCode(CASE_NBR)

                .setDeptId(record.getStr("DEPOT_ID"))

                .setOrderCode(record.getStr("ORDER_CODE"));

        saveList.add(material);

    } else if (record.getStr("CREATEDATE").compareTo(material.getCreateDate()) > 0) {

        material.setDeptId(record.getStr("DEPOT_ID"))

                .setOrderCode(record.getStr("ORDER_CODE"));

        updateList.add(material);

    }

    cacheService.removeCache(CacheBase, MaterialById, CASE_NBR);

});



if (!saveList.isEmpty()) {

    Db.batchSave(saveList, batchSize);

}

if (!updateList.isEmpty()) {

    Db.batchUpdate(updateList, batchSize);

}


List<Material> materialList = new ArrayList<>();

materialList.addAll(saveList);

materialList.addAll(updateList);



materialList.forEach(material -> {

    Order order = cacheService.getOrderByCode(material.getOrderCode());

    if (order == null) {

        Order newOrder = new Order();

        newOrder.setId(IDGenerator.makeId());

        newOrder.setDeptId(material.getDeptId());

        newOrder.setCode(material.getOrderCode());

        newOrder.setCreateDate(DateUtil.now());

        // 初始状态为待复核

        newOrder.setState(SysConstant.StateNeedConfirm);

        newOrder.save();

    }

});



if (true) {

    List<Tag> tagSaveList = new ArrayList<>();

    List<Tag> tagUpdateList = new ArrayList<>();

    materialList.forEach(material -> {

        Tag tag = cacheService.getTagById(material.getSpdCode());

        if (tag == null) {

            tag = new Tag()

                    .setSpdCode(material.getSpdCode())

                    .setEpc(null)

                    .setAccept(TagNo)

                    .setGoodsId(material.getGoodsId())

                    .setDeptId(material.getDeptId())

                    .setOrderCode(material.getOrderCode())

                    .setBatchNo(material.getBatchNo());

            tagSaveList.add(tag);

        } else {

            tag.setGoodsId(material.getGoodsId())

                    .setDeptId(material.getDeptId())

                    .setOrderCode(material.getOrderCode())

                    .setBatchNo(material.getBatchNo())

                    .setExpireDate(material.getExpireDate());

            tagUpdateList.add(tag);

        }


        cacheService.removeCache(CacheCom, TagById, material.getSpdCode());

    });



    if (!tagSaveList.isEmpty()) {

        Db.batchSave(tagSaveList, batchSize);

    }

    if (!tagUpdateList.isEmpty()) {

        Db.batchUpdate(tagUpdateList, batchSize);

    }

}


当前这段代码是放到jfinal 定时任务中的,15分钟执行一次,昨天突然出现这种情况,

saveList 长度也就1000多,但是程序不执行

List<Material> materialList = new ArrayList<>();

以下的内容了,等过几次定时任务,才会执行以下的代码,这其中会出现丢数据的情况,就是

newOrder.save();

Db.batchSave(tagSaveList, batchSize);

都没有保存到数据。


这个情况,昨天之前都是好的,昨天突然发生的。这种情况下,请问能加事务解决这个问题吗?

评论区

杜福忠

2026-02-06 20:35

信息太少,提供一点排查方向:1、看到代码forEach里面有做数据库查询,这个任务多的时候,是否会导致jdbc连接池不够用,线程等待了。 2、开发时不能复现的问题,要对每步操作进行日志记录、异常记录等,看日志进行下一步排查

热门反馈

扫码入社