概述
背景
实习期间一个任务对接webservice接口,将返回来的数据同步到自己的数据库中,同步的思路简单粗暴,直接删除自己表中的全部数据,再将接口返回的数据全部插进去。
过程
一开始用spring data jpa中的deleteAll()和saveAll()这两个方法,能实现需求,但是性能太差,原因在于
- deleteAll()要先进行一次全表查询,然后再根据主键一条条删除
- saveAll()每次插入前都进行一遍查询,查询是否存在,存在则更新,否则插入
改进
- 使用deleteAllInBatch()替换deleteAll()
其中删除全表数据显然一条语句 delete from XXtable 就能够实现,没必要一条一条删除,jpa中也提供了另一个方法deleteAllInBatch(),这个方法删除全表数据就只执行一条delete语句,性能明显提升
- 重新写一个批量插入的Service
@Transactional
@Service
public class BatchService {
@PersistenceContext
private EntityManager entityManager;
/**
* 批量插入
*
* @param list 实体类集合
* @param <T>
表对应的实体类
*/
public <T> void batchInsert(List<T> list) {
if (!ObjectUtils.isEmpty(list)){
for (int i = 0; i < list.size(); i++) {
entityManager.persist(list.get(i));
}
entityManager.flush();
entityManager.clear();
}
}
}
saveAll()的性能太差了,另外spring data jpa中也没有提供一个高效批量插入的方法,个人猜想,应该是能直接往数据库表里批量插入的条件太苛刻了吧,只有在空表的情况下才能不考虑 要插入的数据是不是已经存在表中了 这种情况。
所以需要自己实现一个批量插入的方法,跟saveAll()类似,只是去掉了一个判断(判断表中是否已经存在这条数据,因为是空表,所以就不需要这个判断了),直接进行插入。
参考
spring data jpa开启批量插入、批量更新
最后
以上就是迅速狗为你收集整理的spring data jpa删除全部数据和批量插入遇到的问题以及解决方法的全部内容,希望文章能够帮你解决spring data jpa删除全部数据和批量插入遇到的问题以及解决方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复