使用 Spring Boot 和 Spring Data JPA 批量插入不工作
Bulk insert with Spring Boot and Spring Data JPA not working
我知道关于这个论点有很多类似的问题,但我真的需要一个可行的解决方案。
我正在尝试配置 Spring 引导和 Spring 数据 JPA,以便批量插入。
目标是:提交每个 N 条记录,而不是在执行 repository.save()
操作时提交每个记录。
从现在开始我在 application.properties
中尝试过的:
spring.jpa.properties.hibernate.jdbc.batch_size=100
spring.jpa.properties.hibernate.order_inserts=true
spring.jpa.properties.hibernate.order_updates=true
spring.jpa.properties.hibernate.generate_statistics=true
但是没有成功。我已经监控了数据库,并且记录一个一个地保存在表中,而不是像我配置的那样 100 × 100。
更新
实现如下:
@Component
public class BulkInsert {
@Autowired
MyRepository repository;
public void process() {
PodamFactory podamFactory = new PodamFactoryImpl();
for(int i=0;i<10000;i++) {
MyEntity myEntity = podamFactory.manufacturePojo(MyEntity.class);
repository.save(myEntity);
}
}
}
这是实体:
@Entity
@Table(name="MYTABLE")
@NamedQuery(name="MyEntity.findAll", query="SELECT m FROM MyEntity m")
public class MyEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name="DESCRIPTION")
private String description;
@Id
@Column(name="ID")
private String id;
public MyEntity() {
}
// getters and setters
}
存储库:
public interface MyRepository extends CrudRepository<MyEntity, String> {
}
尝试像这样更改您的代码:
public void process() {
PodamFactory podamFactory = new PodamFactoryImpl();
List<MyEntity> myEntities = new ArrayList<>(10000);
for(int i = 0; i < 10000; i++) {
myEntities.add(podamFactory.manufacturePojo(MyEntity.class));
}
repository.save(myEntities); // for Spring Boot prior 2.0
// repository.saveAll(myEntities); - for Spring Boot since 2.0
}
P.S。不要忘记打开 spring.jpa.show-sql
以查看结果
更新
另请查看我关于批量插入的另一个答案:
在我的例子中,即使使用这些配置,批量插入也无法正常工作。
事实证明,如果实体使用 GenerationType.IDENTITY
标识符生成器,Hibernate 将静默禁用批处理 inserts/updates。
也许这会对其他人有所帮助。
来源:http://kyriakos.anastasakis.net/2015/06/12/batch-inserts-with-spring-data-and-mysql/
我正在使用:
- MySql 5.6
- Spring 引导 2.1.9
- JPA 和休眠
我知道关于这个论点有很多类似的问题,但我真的需要一个可行的解决方案。
我正在尝试配置 Spring 引导和 Spring 数据 JPA,以便批量插入。
目标是:提交每个 N 条记录,而不是在执行 repository.save()
操作时提交每个记录。
从现在开始我在 application.properties
中尝试过的:
spring.jpa.properties.hibernate.jdbc.batch_size=100
spring.jpa.properties.hibernate.order_inserts=true
spring.jpa.properties.hibernate.order_updates=true
spring.jpa.properties.hibernate.generate_statistics=true
但是没有成功。我已经监控了数据库,并且记录一个一个地保存在表中,而不是像我配置的那样 100 × 100。
更新
实现如下:
@Component
public class BulkInsert {
@Autowired
MyRepository repository;
public void process() {
PodamFactory podamFactory = new PodamFactoryImpl();
for(int i=0;i<10000;i++) {
MyEntity myEntity = podamFactory.manufacturePojo(MyEntity.class);
repository.save(myEntity);
}
}
}
这是实体:
@Entity
@Table(name="MYTABLE")
@NamedQuery(name="MyEntity.findAll", query="SELECT m FROM MyEntity m")
public class MyEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name="DESCRIPTION")
private String description;
@Id
@Column(name="ID")
private String id;
public MyEntity() {
}
// getters and setters
}
存储库:
public interface MyRepository extends CrudRepository<MyEntity, String> {
}
尝试像这样更改您的代码:
public void process() {
PodamFactory podamFactory = new PodamFactoryImpl();
List<MyEntity> myEntities = new ArrayList<>(10000);
for(int i = 0; i < 10000; i++) {
myEntities.add(podamFactory.manufacturePojo(MyEntity.class));
}
repository.save(myEntities); // for Spring Boot prior 2.0
// repository.saveAll(myEntities); - for Spring Boot since 2.0
}
P.S。不要忘记打开 spring.jpa.show-sql
以查看结果
更新
另请查看我关于批量插入的另一个答案:
在我的例子中,即使使用这些配置,批量插入也无法正常工作。
事实证明,如果实体使用 GenerationType.IDENTITY
标识符生成器,Hibernate 将静默禁用批处理 inserts/updates。
也许这会对其他人有所帮助。
来源:http://kyriakos.anastasakis.net/2015/06/12/batch-inserts-with-spring-data-and-mysql/
我正在使用:
- MySql 5.6
- Spring 引导 2.1.9
- JPA 和休眠