最近老板说,感觉platform打开或者切换不同report的时候速度有点慢,以前还是很快的。Emmm...老板发话了,总要有点行动的。
打开浏览器,F12 。发现有些request的请求会达到20s以上,页面数据也是用异步的方式请求。而且有个现象是一旦某个块加载完毕之后,其余的就很快也loading出来了。
抓个主要矛盾吧。我们随机挑选一个“幸运”request。
后端是springboot,简单写了个测试,来测试这个请求,看看它做了什么。跑完测试发现,数据请求到结束花了18s以上,感觉这边响应速度太慢了。一般超过5s的请求对于用户来说就很慢了。
在application-properties里面打开sql显示:spring.jpa.show-sql=true
再次执行测试,发现控制台打印了很多切重复的sql语句,怀疑代码里有for循环,反复调用查询语句了。爬代码发现了
- 第一个性能优化点:
for(int i=0;i< size; i++){
repository.findLrByBizAndModule(biz,module);
}
这样写肯定是不对的,无论循环体里的查询速度有多快,消耗的数据库资源还是可观的。我们要把查询从循环体中拿出来。提前一次性插好,放入内存里。查询数据的sql分析了下还是可以的,1ms不到。
- 第二个性能点:
关联表的索引。发现jpa会建外键,但是关联字段并不会建索引。于是将两个一对多的数据表关联column加上了索引。查询速度快了8倍,基本上也是毫秒级别的。 - 第三个性能点:
发现我只是简单的查询一个report的数据,后台打印了很多不相关的sql,但是都是跟这个entity关联的。爬代码发现
申明的entity用的是:fetch = FetchType.EAGER,这是一个急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载。考虑到我们只做查询,符合懒加载的模式,将fetch 改为 fetch = FetchType.LAZY。改完之后,再次loading platform,发现页面加载数据很快了。
当然这次的性能问题还没有到jvm级别,从进程消耗来看CPU和memory都消耗不大。










网友评论