2016-02-11 3 views
0

Я использую данные Spring, Spring Boot и Hibernate как поставщик JPA, и я хочу улучшить производительность при массовой загрузке.Весенние данные JPA HIbernate пакетная вставка медленнее

Я имею в виду эту ссылку, чтобы использовать пакетную обработку:

http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html/ch15.html

Это мой код, и мои application.properties для вставки дозирования эксперимента.

Моя служба:

@Value("${spring.jpa.properties.hibernate.jdbc.batch_size}") 
    private int batchSize; 

    @PersistenceContext 
    private EntityManager em; 

    @Override 
    @Transactional(propagation = Propagation.REQUIRED) 
    public SampleInfoJson getSampleInfoByCode(String code) { 
//  SampleInfo newSampleInfo = new SampleInfo(); 
//  newSampleInfo.setId(5L); 
//  newSampleInfo.setCode("SMP-5"); 
//  newSampleInfo.setSerialNumber(10L); 
//  sampleInfoDao.save(newSampleInfo); 
     log.info("starting... inserting..."); 
     for (int i = 1; i <= 5000; i++) { 
      SampleInfo newSampleInfo = new SampleInfo(); 
//   Long id = (long)i + 4; 
//   newSampleInfo.setId(id); 
      newSampleInfo.setCode("SMPN-" + i); 
      newSampleInfo.setSerialNumber(10L + i); 
//   sampleInfoDao.save(newSampleInfo); 
      em.persist(newSampleInfo); 
      if(i%batchSize == 0){ 
       log.info("flushing..."); 
       em.flush(); 
       em.clear(); 
      } 
     } 

часть application.properties, что связано с дозированием:

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

Entity класса:

@Entity 
@Table(name = "sample_info") 
public class SampleInfo implements Serializable{ 

    private Long id; 
    private String code; 
    private Long serialNumber; 

    @Id 
    @GeneratedValue(
      strategy = GenerationType.SEQUENCE, 
      generator = "sample_info_seq_gen" 
    ) 
    @SequenceGenerator(
      name = "sample_info_seq_gen", 
      sequenceName = "sample_info_seq", 
      allocationSize = 1 
    ) 
    @Column(name = "id") 
    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @Column(name = "code", nullable = false) 
    public String getCode() { 
     return code; 
    } 

    public void setCode(String code) { 
     this.code = code; 
    } 

    @Column(name = "serial_number") 
    public Long getSerialNumber() { 
     return serialNumber; 
    } 

    public void setSerialNumber(Long serialNumber) { 
     this.serialNumber = serialNumber; 
    } 
} 

Запуск службы выше партии вставляя 5000 строк взял От 30 до 35 секунд, но если прокомментировать эти строки:

if(i%batchSize == 0){ 
    log.info("flushing..."); 
    em.flush(); 
    em.clear(); 
} 

Вставка 5000 строк занимает всего 5-7 секунд, быстрее, чем пакетный режим.

Почему он работает медленнее при использовании пакетного режима?

ответ

0

Это потому, что EntityManager не сохраняет данные в базе данных сразу. И когда вы вызываете flush(), данные будут сохранены. Когда вы прокомментируете эти строки, EntityManager сбрасывает данные в зависимости от параметра флеш-режима, вызывая флеш прямо, вы указываете, что EntityManager выполняет запросы в базе данных.

+0

Таким образом, результат, который я получил, нормален? Использование дозирования всегда будет медленнее, чем не использовать дозирование, правильно? –

+0

Результат нормальный. Пакетирование необходимо, когда ваши сущности могут переполнять спящий сеанс кеша уровня сеанса, но это должно быть много объектов (в десять раз больше, а затем ваш пример). Если вы не знаете размер массива объектов, вы можете добавить пакетную обработку, но увеличить 'batchSize' до 10 000 и т. Д. – D0dger

+0

« EntityManager сбрасывает данные при совершении транзакций ». Я думаю, что это утверждение неверно. Режим сброса по умолчанию Hibernate - AUTO, и вы не можете выполнить квадрирование времени сброса. Если в режиме флеша явно установлено значение COMMIT, да на этот раз вы правы. – jit

Смежные вопросы