处理思路
//传统的分页查询模式:
criteria.setFirstResult((pageNumber - 1) * pageSize);
criteria.setMaxResults(pageSize);
return criteria.list();
//说明:这种模式下,百万左右的数据,点最后一页,就是漫长的等待,然后timeout。
//第二种思路:
//将你要的结果集ID取出
List idsList = new ArrayList();
String sql = "select id/主键 from tableName where 1=1 and XXX; "
idsList = getSession().createSQLQuery(sql).list();
//需要的主键集合
List currentPageIds = new ArrayList<String>();
//起始位置
int begin = (pageNumber () - 1) * pageSize;
//写入主键
outer:for (int i = 0; i < pageSize; i++) {
//数据结尾终止
if (idsList.size() == (begin + i)) {
break outer;
}
currentPageIds .add(idsList.get(begin + i));
}
//这里用IN ,pageSize不可以超过1000。具体情况自己选择
criteria.add(Restrictions.in("id", currentPageIds));
return criteria.list();
//说明:先查ids,由程序完成分页计算取得当前页的IDS,查询当前页IDS的实际数据集合。 200W数据,oracle10G耗时3-4秒。
//缺点:每翻一页就需要查询一次所有数据的IDS,耗时3-4秒。解决办法,使用第三方缓存,缓存idsList,当查询条件不变的情况下,200W数据 任意定位某一页
//增删改频繁的情况,缓存配置粒度要细。