如何为批量插入配置spring boot和data jpa

Posted

技术标签:

【中文标题】如何为批量插入配置spring boot和data jpa【英文标题】:how to configure spring boot and data jpa for batch insert 【发布时间】:2018-07-08 03:38:55 【问题描述】:

我正在使用 spring boot 和 spring data jpa with hibernate,japrepository.save(List) 花了 20 分钟将 8000 条记录保存到 oracle 数据库。有人可以帮我解决它。在 application.properties 中添加 spring.jpa.properties.hibernate.jdbc.batch_size=1000 也没有帮助。

应用程序属性

server.servlet-path = /*         
spring.datasource.jndi-name=jdbc/mydatasource       
spring.datasource.testWhileIdle = true         
spring.datasource.validationQuery = SELECT 1 
spring.jpa.database-platform=org.hibernate.dialect.Oracle10g‌​Dialect 
spring.jpa.properties.hibernate.jdbc.batch_size=1000                                        

【问题讨论】:

您是否使用 GeneratedValue 生成主键?如果是的话,什么策略 @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ubseq") @SequenceGenerator(sequenceName = "OWNER.ub_seq", schema = "OWNER", allocationSize = 1, name = "ubseq" ") 私人长ID; 问题可能出在 Sequence 的 allocationSize 上,因为每次插入都会获得一个新的序列号,这是一项昂贵的操作。将其设置为 1 是否有原因? 没有具体原因,其实我对Spring/Hibernate框架不是很熟悉。我需要序列中的主键值,或者如果您可以建议其他方法,请尝试。 太好了,我刚刚从 SequenceGenerator 中删除了 'allocationSize = 1' 属性,所有 8000 条记录都在 1 分钟内保存了下来。最初我认为它就像加一一样。现在我的代码在 Tomcat 中运行,我需要将它实际部署在 JBoss 上,让我们看看它是如何工作的。非常感谢 Simon Martinelli :) 【参考方案1】:

问题可能出在 Sequence 的 allocationSize 上,因为每次插入都会获得一个新的序列号,这是一项昂贵的操作。

如果您可以将 allocationSize 设置为适合您的情况的更高值。

【讨论】:

【参考方案2】:

尝试使用合理的 batch_size,比如 50 或 30。除此之外,尝试设置参数

spring.jpa.hibernate.order_inserts=true spring.jpa.hibernate.order_updates=true

所以插入和更新是在发送到数据库之前排序的。也看这里Spring Boot JPA Bulk insert或https://memorynotfound.com/hibernate-jpa-batch-insert-batch-update-example/

更多示例和详细信息。

【讨论】:

我尝试添加 spring.jpa.properties.hibernate.jdbc.batch_size=100 spring.jpa.hibernate.order_inserts=true spring.jpa.hibernate.order_updates=true 单独没有解决问题但是这些配置还需要从 SequenceGenerator 中删除“分配大小”。谢谢弗朗西斯科

以上是关于如何为批量插入配置spring boot和data jpa的主要内容,如果未能解决你的问题,请参考以下文章