hibernate百万数据分页处理

处理思路

//传统的分页查询模式:
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数据 任意定位某一页
//增删改频繁的情况,缓存配置粒度要细。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值