簡體   English   中英

如何批量插入Spring-Batch?

[英]How to bulk insert with Spring-Batch?

我正在嘗試使用spring-batch進行批量/批量插入。

public ItemWriter<MyEntity> jpaItemWriter() {
    LocalSessionFactoryBuilder builder = new LocalSessionFactoryBuilder(ds);
    builder.addAnnotatedClasses(MyEntity.class);
    builder.setProperty("hibernate.show_sql", "true");
    builder.setProperty("hibernate.batch_size", "20");
    builder.setProperty("hibernate.order_updates", "true");
    builder.setProperty("hibernate.order_inserts", "true");
    HibernateItemWriter<MyEntity> writer = new HibernateItemWriter<>();
    writer.setSessionFactory(builder.buildSessionFactory());
    return writer;
}

結果:我只獲得單個insert語句,而不是批量插入! 我可以在postgresql級別的hibernate +日志中看到它。 為什么批量插件不起作用?

更新:

@Entity
public class MyEntity {
    @Id
    String shortname;
    String fullname;
}

Spring與SQL語句批處理無關,它全部由Hibernate管理。
我看到你已經啟用並正確配置了批處理,但這還不足以讓它工作......你還需要使用正確的會話類型。 在hibernate中有兩種會話類型: 有狀態會話和無狀態會話。
有狀態會話,是通過獲得的

sessionFactory.openSession();

默認情況下,如果使用@Transactional,則永遠使用,從不使用批處理(即使已配置)並在事務提交時立即發送所有SQL語句。 但是,您可以通過不時調用flush()來模擬批處理,並且SQL語句將在每次flush()時發送到db。

無狀態會話,是通過獲得的

sessionFactory.openStatelessSession();

尊重批處理配置,所以只需切換到無狀態會話,批處理將按預期工作。 Hibernate將記錄每個session.insert(),但不會將SQL insert語句發送到數據庫,而是將SQL insert語句作為配置大小的批處理發送。 所以最好“tail -f”數據庫日志。 擁有兩種會話類型的主要思想是, 有狀態會話使用緩存,每個保存的實體最終都在第一級緩存中,因此如果您節省了100k實體,您將獲得OOM。 解決方案是使用無狀態會話,該會話不與任何級別緩存交互。 您可以閱讀有關無狀態會話的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM