在Spring DATA JPA的保存(Iterable <S>实体)中命中数据库的次数

Avi*_*tta 5 java spring hibernate spring-data-jpa

我有以下几行代码:

@RequestMapping(value="/persons",method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<List<Person>> saveUsers(@RequestBody List<Person> persons) {
        persons = (List<Person>) userRepository.save(persons);
        return new ResponseEntity<List<Person>>(persons, HttpStatus.OK);
}
Run Code Online (Sandbox Code Playgroud)

这是存储库:

@Transactional
public interface UserRepository  extends UserBaseRepository<User> { 
}

@NoRepositoryBean
public interface UserBaseRepository<T extends User> extends CrudRepository<T, Long> {
    public T findByEmail(String email);
}
Run Code Online (Sandbox Code Playgroud)

它运行正常.运行代码时,我看到以下日志.

Hibernate: insert into user (email, firstname, lastname, user_type) values (?, ?, ?, 'Person')
Hibernate: insert into user (email, firstname, lastname, user_type) values (?, ?, ?, 'Person')
Hibernate: insert into user (email, firstname, lastname, user_type) values (?, ?, ?, 'Person')
Hibernate: insert into user (email, firstname, lastname, user_type) values (?, ?, ?, 'Person')
Run Code Online (Sandbox Code Playgroud)

看来,DataBase被击中了4次.我已经看到了save(iterable e)方法的实现,其中运行for循环来保存每个实体.所以,我的问题是:

  1. 数据库命中4次?
  2. 如果是这样,那么它可以在1 db命中(使用Spring Data JPA)吗?通过这样做,它会在插入大量记录时提高性能吗?

Dav*_*Yee 4

是的,您正在查询数据四次。

您可以通过实现Hibernate Batching在一个批处理语句中完成插入。特别是,看看执行批量插入。使用批量插入,您必须通过显式调用会话中的flush()clear()方法来手动控制会话。

另外,请考虑设置适当的Hibernate 批处理属性,例如批处理大小(默认为 5),以及 Hibernate 在构建批处理语句之前重新排序插入和更新的权限(如果适用):

hibernate.jdbc.batch_size = 25
hibernate.order_inserts = true
hibernate.order_updates = true
Run Code Online (Sandbox Code Playgroud)