背景
实习期间一个任务对接webservice接口,将返回来的数据同步到自己的数据库中,同步的思路简单粗暴,直接删除自己表中的全部数据,再将接口返回的数据全部插进去。
过程
一开始用spring data jpa中的deleteAll()和saveAll()这两个方法,能实现需求,但是性能太差,原因在于
- deleteAll()要先进行一次全表查询,然后再根据主键一条条删除
- saveAll()每次插入前都进行一遍查询,查询是否存在,存在则更新,否则插入
改进
- 使用deleteAllInBatch()替换deleteAll()
其中删除全表数据显然一条语句 delete from XXtable 就能够实现,没必要一条一条删除,jpa中也提供了另一个方法deleteAllInBatch(),这个方法删除全表数据就只执行一条delete语句,性能明显提升
- 重新写一个批量插入的Service
@Transactional
@Service
public class BatchService