[英]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.