惨案背景:前端反映,分页查询接口速度过慢,让我想办法优化。
我立刻想到了去做视图,提高查询速度,于是呼呼呼一大堆,做了视图,重写了查询,测试之后发现速度提升了1s,聊胜于无。于是我开始做测试,想要测试那一步占用时间最长,结果是发现了这一行代码。
List<LogMonitor> logMonitors= logMonitorService.findAll(con);
int count =logMonitors.size();
我为了获取分页查询结果的总数,用了全部查询(findAll)去获取,结果导致相当于在分页查询中查询了一次全部的表。
最后的处理是在Dao层写了一个获取总数的方法,写完之后,测试一下,500行,240ms。
铭刻耻辱柱!!!
public int getCount(DetachedCriteria dc){
Session session = sessionFactory.getCurrentSession();
Criteria c = dc.getExecutableCriteria(session);
c.setProjection(rowCount()); //查询结果返回的行数
return c;
}