springdatajpa开启批量插⼊、批量更新
原⽂链接:
原⽂作者:博客园--曲⾼终和寡
*******************如果你看到这⼀⾏,说明爬⾍在本⼈还没有发布完成的时候就抓⾛了我的⽂章,导致内容不完整,请去上述的原⽂链接查看原⽂****************
最近准备上spring全家桶写⼀下个⼈项⽬,该学的都学学,其中ORM框架,最早我⽤的是jdbcTemplate,后来⽤了Mybatis,唯独没有⽤过JPA(Hibernate)系的,过去觉得Hibernate太重量级了,后来随着springboot和spring data jpa出来之后,让我觉得好像还不错,再加上⾕歌趋势。。。
只有中⽇韩在⼤规模⽤Mybatis(我严重怀疑是中国的外包),所以就很奇怪,虽然说中国的IT技术在慢慢抬头了,但是这社会IT发展的主导⽬前看来还是美国、欧洲,这⾥JPA、Hibernate是绝对的主流,那么我觉得学习并以JPA为主开发是我接下来个⼈项⽬的选择。
那么经过⼏天简单的摸索,发现JPA可以说是⾮常的好⽤,尤其DDD设计思想简直完美符合现在springboot、微服务的设计理念(仅代表个⼈看法)。
不过呢,在使⽤过程中就会遇到⼀个问题,我之前写的爬⾍插⼊效率⾮常低,⼀⽅⾯是因为我服务器上Mysql表现的极差,详情请看:
另外⼀⽅⾯,JPA的批量插⼊源码:
这saveAll明明就是循环调⽤save⽅法了啊,我们写个简单的测试插⼊数据⽅法试⼀下:
我们打开了Hibernate显⽰sql⽇志,看⼀下输出结果:
看⽇志,JPA是先把所有的数据全查出来了,如果数据库有就更新,没有就新增。我们再看⼀下阿⾥的监控,如果没有配可以按照这个⽂章⾥⾯的⽅法配
我插了5条数据,结果执⾏了10次sql,这特么。。。我不太能理解,可能是我太菜了?我跑脚本⾄少了成千上万条数据往库⾥插,这种写法得给我辣鸡数据库写死。
并且这样效率也太低了吧,查询不会⽤in?insert不会拼sql?并且很多场景我⾃⼰能控制是插⼊还是新增,我根本不需要你给我校验⼀次,我只想安安静静的插数据,那么有没有办法呢?有的。
在配置⽂件⾥加⼊:
spring.jpa.properties.hibernate.jdbc.batch_size=500
spring.jpa.properties.hibernate.jdbc.batch_versioned_data=true
spring.jpa.der_inserts=true
spring.jpa.der_updates =true
这个batch size建议设置成你数据库每秒最⼤写⼊数/2 ,没有理由只是我⾃⼰感觉这样好⼀点。。。
⾃⼰在repository⾥⾯定义两个接⼝ batchSave,batchUpdate并实现:
@Override
@Transactional
public <S extends T> Iterable<S> batchSave(Iterable<S> var1) {
Iterator<S> iterator = var1.iterator();
int index = 0;
while (iterator.hasNext()){
em.());
index++;
if (index % BATCH_SIZE == 0){
em.flush();
em.clear();
}
jpa mybatis}
if (index % BATCH_SIZE != 0){
em.flush();
em.clear();
}
return var1;
}
@Override
public <S extends T> Iterable<S> batchUpdate(Iterable<S> var1) {
Iterator<S> iterator = var1.iterator();
int index = 0;
while (iterator.hasNext()){
<(());
index++;
if (index % BATCH_SIZE == 0){
em.flush();
em.clear();
}
}
if (index % BATCH_SIZE != 0){
em.flush();
em.clear();
}
return var1;
}
然后对批量插⼊的⼊⼝稍作改动,改成刚刚⾃⼰实现的调⽤batchSave的⽅法
我们运⾏⼀下看看结果:
这次500条⽤了778毫秒,跟之前5条712相差不多,但是我们⼤家看到了,控制台打印了500条插⼊语句。。。这个导致我⼀度以为批量插⼊失败了,按理说看时间是成功了呀,所以后来配置了阿⾥的监控⼀看:
放⼼了,是Hibernate⾃⼰⽇志打印有问题,所以后来我给Hibernate⽇志打印关掉了,专⼼⽤阿⾥的druid
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论