【问题标题】:Can I use Spring Data saveAll() method and Hibernate 5 batch?我可以使用 Spring Data saveAll() 方法和 Hibernate 5 批处理吗?
【发布时间】:2017-09-04 15:23:02
【问题描述】:

我有一个带有 application.yml 的 Spring Boot 应用程序:

spring:
    datasource:
        driver-class-name: org.postgresql.Driver
        url: *my_url*
        password: *my_pass*
        username: *my_username*
    jpa:
        properties:
            hibernate:
                jdbc:
                    batch_size: 15
                    #order_inserts: true
                    #order_updates: true
                    #batch_versioned_data: true

当我尝试使用 saveAll(Iterable<S> entities) 方法保存 200 000 个实体时,它会同时保存所有 200 000 个实体,但我想一次保存 15 个实体的批次。

是否可以使用Spring Data的SimpleJpaRepository和Hibernate的批处理?

【问题讨论】:

标签: java hibernate spring-data


【解决方案1】:

我的方法))

@Service
public class BulkService {

    @PersistenceContext
    private EntityManager em;

    // @Value("${spring.jpa.properties.hibernate.jdbc.batch_size}")
    private int batchSize = 20;

    private List<Entity> savedEntities;

    public Collection<Entity> bulkSave(List<Entity> entities) {
        int size = entities.size();
        savedEntities = new ArrayList<>(size);

        try {
            for (int i = 0; i < size; i += batchSize) {
                int toIndex = i + (((i + batchSize) < size) ? batchSize : size - i);
                processBatch(entities.subList(i, toIndex));
                em.flush();
                em.clear();
            }
        } catch (Exception ignored) {
            // or do something...  
        }
        return savedEntities;
    }

    @Transactional
    protected void processBatch(List<Entity> batch) {

        for (Entity t : batch) {
            Entity result;
            if (t.getId() == null) {
                em.persist(t);
                result = t;
            } else {
                result = em.merge(t);
            }
            savedEntities.add(result);
        }
    }
}

工作exampletest

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 2020-04-28
    • 2021-04-19
    • 1970-01-01
    • 2022-11-11
    • 2017-03-07
    • 1970-01-01
    • 2019-01-14
    相关资源
    最近更新 更多