Spring Boot MySQL 不批量插入

Posted

技术标签:

【中文标题】Spring Boot MySQL 不批量插入【英文标题】:Spring Boot MySQL not batching inserts 【发布时间】:2019-02-09 05:12:24 【问题描述】:

关于这个问题,我已经应用了几乎所有在 SO 上发布的解决方案,但没有任何效果。

我的application.properties

spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.url=jdbc:mysql://localhost:3306/mydb?logger=com.mysql.jdbc.log.Slf4JLogger&rewriteBatchedStatements=true&profileSQL=true&autoReconnect=true&useSSL=false
spring.datasource.username=user
spring.datasource.password=secret
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.jpa.hibernate.jdbc.batch_size = 100
spring.jpa.hibernate.order_inserts   = true 
spring.jpa.hibernate.order_updates   = true

logging.level.root=info
logging.pattern.console=%dyyyy-MM-dd HH:mm:ss %highlight(%-5p) %gray(%c0::%M) - %m%n

我的EntityRepository

@Repository
public interface EntityRepository extends CrudRepository<Entity, Long>  

我的实体

@Data @Entity
public class Entity 

  @Id
  @GeneratedValue(generator = "generator")
  @GenericGenerator(name = "generator", strategy = "increment")
  private Long id;

  private Long attr;


以及调用存储库的简化代码:

int batchSize = 100;
List<Entity> batchEntities = new ArrayList<>();
for(Entity entity : entities) 
  batchEntities.add(entity);
  if(batchEntities.size() >= batchSize) 
    entityRepository.saveAll(batchEntities);
    batchEntities.clear();
  

我做了什么:

根据this SO question,我启用了profileSQL=true 选项,并且日志产生了几个单独的插入。另外,我在 SQL Server 上启用了全局日志记录,它也会生成单个插入序列。

根据this another SO question 和yet another SO question,我确保batch_size 设置在application.properties 文件中,虽然我没有父子关系,但我也尝试使用order_insertsorder_updates。另外,我启用了rewriteBatchedStatements=true 选项并使用saveAll(...) 方法。

我还尝试抛弃预制的CrudRepository 和我的自定义的,方法是在每个batchSize-th 坚持后冲洗。

以上没有任何帮助。

【问题讨论】:

spring.jpa.hibernate.order_updates 不会做任何事情(同样适用于其他属性)。而是使用spring.jpa.properties.hibernate.order_updates(同样适用于其他自定义休眠属性)。 @M.Deinum 谢谢!它现在完美运行。不敢相信我错过了。您想将您的评论改写成答案以便我接受吗? 【参考方案1】:

以下属性在 Spring Boot 中不存在。

spring.jpa.hibernate.jdbc.batch_size = 100
spring.jpa.hibernate.order_inserts   = true 
spring.jpa.hibernate.order_updates   = true

要添加自定义属性,请改用spring.jpa.properties 前缀。

spring.jpa.properties.hibernate.jdbc.batch_size = 100
spring.jpa.properties.hibernate.order_inserts   = true 
spring.jpa.properties.hibernate.order_updates   = true

应该做的伎俩。

另请参阅 how to configure JPA 上的 Spring Boot 文档。

【讨论】:

以上是关于Spring Boot MySQL 不批量插入的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Boot 和 Spring Data JPA 批量插入不起作用

Spring Boot 集成 Druid 批量插入数据和效率监控配置

Spring Boot 集成 Druid 批量插入数据和效率监控配置

Spring Boot 集成 Druid 批量插入数据和效率监控配置

Spring Boot JPA 批量插入

spring boot + mybatis批量插入大量数据(超过10000条)