JPA批量插⼊优化
遇到⼀个需求是excel数据导⼊,⼀次⼤概会批量插⼊⼏万的数据。写完⼀测奇慢⽆⽐。
于是开始打⽇志,分析代码,发现是插⼊数据库的时候耗时很长,发现是spring data jpa的原因。
翻看jpa的源码
@Transactional
public <S extends T> List<S> saveAll(Iterable<S> entities) {
List<S> result = new ArrayList<S>();
for (S entity : entities) {
result.add(save(entity));
}
return result;
}
这⾥会循环对每个对象进⾏save操作,看到这⾥问题也⼤概清楚了,多次insert操作。
再看看save操作
1    @Transactional
2public <S extends T> S save(S entity) {
3
4if (entityInformation.isNew(entity)) {
5            em.persist(entity);
6return entity;
7        } else {
(entity);
9        }
10    }
保存的时候,会对对象做存在性检查,就是先查⼀边,要是不存在才会保存。
优化⽅案有很多种,但是要从根本上解决这个问题,就要避免jpa 的多次保存和存在性检查,才能减少数据库的交互。
最后选⽤的是spring data jpa和spring jdbc组合使⽤,jpa⼤量的写⼊就⽤sprng jdbc。
另外,在数据库地址上加上
jdbctemplate批量insertrewriteBatchedStatements=true 开启批量写⼊
因为spring jdbc 和spring boot 的兼容性很好,基本不需要什么配置,另外spring jdbc 的namedParameterJdbcTemplate.batchUpdate对批量插⼊编写sql也⽐较快捷。
优化之后⽐之前减少90%的时间,看来jpa是真不适合数据量稍⼤的系统,需要和其他框架配合使⽤才⾏。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。