Я использую данные 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 секунд, быстрее, чем пакетный режим.
Почему он работает медленнее при использовании пакетного режима?
Таким образом, результат, который я получил, нормален? Использование дозирования всегда будет медленнее, чем не использовать дозирование, правильно? –
Результат нормальный. Пакетирование необходимо, когда ваши сущности могут переполнять спящий сеанс кеша уровня сеанса, но это должно быть много объектов (в десять раз больше, а затем ваш пример). Если вы не знаете размер массива объектов, вы можете добавить пакетную обработку, но увеличить 'batchSize' до 10 000 и т. Д. – D0dger
« EntityManager сбрасывает данные при совершении транзакций ». Я думаю, что это утверждение неверно. Режим сброса по умолчанию Hibernate - AUTO, и вы не можете выполнить квадрирование времени сброса. Если в режиме флеша явно установлено значение COMMIT, да на этот раз вы правы. – jit