Spring Boot MySQL 不批处理插入



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

我的应用程序属性

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=%d{yyyy-MM-dd HH:mm:ss} %highlight(%-5p) %gray(%c{0}::%M) - %m%n

我的实体存储库

@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();
}
}

我做了什么:

根据这个SO问题,我启用了profileSQL=true选项,日志会生成几个单独的插入。此外,我还在 SQL 服务器上启用了全局日志记录,它也会产生单个插入序列。

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

我还试图抛弃预制CrudRepository和我的自定义,方法是在每batchSize持续刷新一次。

以上没有任何帮助。

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

应该做这个伎俩。

另请参阅有关如何配置 JPA 的 Spring 引导文档。

最新更新