如何为批量插入配置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.Oracle10gDialect
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的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot 集成 Druid 批量插入数据和效率监控配置
如何为 Spring Boot 应用程序外部化 data.sql
Spring Boot 集成 Druid 批量插入数据和效率监控配置
Spring Boot 集成 Druid 批量插入数据和效率监控配置