优化saveAll 批量插入缓慢问题

Posted 棘丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了优化saveAll 批量插入缓慢问题相关的知识,希望对你有一定的参考价值。

jpaSaveAll源码

    @Transactional
    @Override
    public <S extends T> List<S> saveAll(Iterable<S> entities) {

        Assert.notNull(entities, "Entities must not be null!");

        List<S> result = new ArrayList<S>();

        for (S entity : entities) {
        //其主要核心则是save方法
            result.add(save(entity));
        }

        return result;
    }
// save方法    
    @Transactional
    @Override
    public <S extends T> S save(S entity) {
// 每次进来则是需要查询是否存在这个对象
        if (entityInformation.isNew(entity)) {
            em.persist(entity);
            return entity;
        } else {
            return em.merge(entity);
        }
    }

6.4.1 批量插入

解决方案是自己用em进行持久化插入,省了一步查询操作。

@PersistenceContext

private EntityManager entityManager;

@Override

@Transactional(rollbackFor = Exception.class)

public void addBatch(List list) {

for (ProjectApplyDO projectApplyDO : list) {

entityManager.persist(projectApplyDO);//insert插入操作

}

entityManager.flush();

entityManager.clear();

}

6.4.2 批量更新

在确保数据已经存在的情况下,如果是批量更新可以如下代码代替上面的entityManager.persist(projectApplyDO);语句:

entityManager.merge(projectApplyDO);//update更新操作

以上是关于优化saveAll 批量插入缓慢问题的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data JPA saveAll 不进行批量插入

避免 CakePHP 的 saveAll 并使用手动查询

Parse.com 从客户端批量保存 (saveAll) 超时

EF批量插入数据缓慢解决方法

为啥 Spring 在配置时并不总是使用批量插入/更新?

是否可以使用 Cakephp 中的 saveAll 一次将所有相关记录插入到 HABTM 中?