Tôi có dòng mã sau đây:Đã bao nhiêu lần cơ sở dữ liệu được nhấn trong tiết kiệm mùa xuân DỮ LIỆU JPA (Iterable <S> thực thể)
@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);
}
Và đây là kho:
@Transactional
public interface UserRepository extends UserBaseRepository<User> {
}
@NoRepositoryBean
public interface UserBaseRepository<T extends User> extends CrudRepository<T, Long> {
public T findByEmail(String email);
}
Nó chạy tốt . Trong khi chạy mã tôi thấy các bản ghi sau.
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')
Dường như, DataBase được nhấn 4 lần. Tôi đã thấy việc thực hiện phương thức save (iterable e), nơi vòng lặp for được chạy để lưu từng thực thể. Vì vậy, câu hỏi của tôi là:
- là lần truy cập DB 4 lần?
- nếu có, sau đó nó có thể được thực hiện trong lần truy cập 1 db (sử dụng dữ liệu Spring JPA) không? Bằng cách làm như vậy, nó sẽ cung cấp cho một tăng hiệu suất trong trường hợp chèn một số lượng lớn các hồ sơ?
Có, bạn đang nhấn db 4 lần. Nếu bạn đang làm việc với các ứng dụng highload, ý tưởng tốt sẽ là sử dụng hàng loạt ngủ đông hoặc ... tạo ra các lô của riêng bạn bằng cách sử dụng đa luồng. – Reborn
Nó phụ thuộc vào ý bạn bằng cách nhấn vào cơ sở dữ liệu 4 lần - bạn có thể có 4 chèn trên một kết nối, trong đó chi phí thực có khả năng tạo kết nối – farrellmr
@farrellmr: Tôi cũng nghĩ như vậy. Vì vậy, giải pháp chèn các bản ghi ở trên có hiệu quả hơn so với phương thức addBatch() và executeebatch() của JDBC từ quan điểm thực hiện? –