第一次加载,46秒耗时,什么问题,分页只是加载20条数据,为什么要这么久。定点: 居然是查询总数?赶快去dao层查看一下实现代码,我用的ORM是hibernate。
public Long count(String where, Object[] param) {
String hql = "select o.version " + getPageHql(where, param);
Query q = this.getCurrentSession().createQuery(hql);
return Long.parseLong(q.list().size() + "");
}
q.list.size()方法这是啥玩意,居然全部加载,架构起点是我从网上抄过来的一些基本框架。
public Long count(String where, Object[] param) {
String hql = "select count(o.version) " + getPageHql(where, param);
Query q = this.getCurrentSession().createQuery(hql);
if(q.uniqueResult()==null)
return 0L;
else
return Long.parseLong(q.uniqueResult()+"");
}
改动代码如上,查询耗时1082ms。继续刷新页面,差不多都是1000ms左右。
这时候将上面的query q开启查询缓存呢,q.setCacheable(true);第一次依然是1000ms左右,然后数据缓存了,第二次只用了299ms。
测试发现count查找时总是打印两条sql,好吧,上面的q.uniquResult()执行了两次。
我把q.setCacheable(true);也去除了,因为我加在了底层实现方法,所有的类进行count都会缓存这个sql语句,对于一些经常更改的表无益而有害,而且加载数据也在1s左右,即使我分页一次加载200条数据,这执行效率也可以接受的,而且访问的是公网linux上的数据库,1M带宽的。
好像只要分页查询,百万级别的数据量也没什么影响啊,可能这只是我单个线程执行吧,测试不出什么东西,等上线多用户吧。待续。。。。。。。。。。。