日期:2014-05-19  浏览次数:20722 次

求帮助:关于java分页查询缓存的设计!急,急,急,急,急
现在又海量数据库需要从Mysql中查询,按条件查询,进行分页,整个系统都只有查询,没有增删改查! 现在需要在分页上做查询的缓存,这个缓存怎么设计,查询开始时候只查询第一页,或前几页! 用户在跳转页数的时候,可能会回到原来的页数!所以要把分页做缓存,希望提供点有用的插件或代码之类的指导指导! hibernate的话我考虑过,因为每页有很多条数据库,怎么把这一页的数据库给缓存起来!希望 高手帮助一下,很急! 
不要复制粘贴网上的!我要实际的应用!

------解决方案--------------------
把结果集保存到一个list里,根据页数和每页最多显示的记录数来定位list的一个范围,显示该范围的数据。
for example
Java code
//每次从已检索的list结果集中取某一页的数据
List<XXXData> getPageData(List<XXXData> list, int page, int pageRecordCount) {
    List<XXXData> result = new ArrayList<XXXData>();
    int offset = (page-1)*pageRecordCount;
    for (int i=0; i<pageRecordCount && i+offset<list.size(); i++) {
        result.add(list.get(i+offset));
    }
    return result;
}

------解决方案--------------------
如果楼主所要查的数据是不变的那些。。

可以考虑使用MYSQL缓存。
------解决方案--------------------
假定你每页显示记录数不变
在session中缓存这样一个对象:Map<查询条件,Map<页号,数据List>> cachedResults
将查询条件拼装成第一层Map的key,页号作为第二层Map的key

查询时先看cachedResults里面有没有对应的查询条件及页号的list,有则取出来返回,没有则到数据库查询,然后放到cachedResults中,再返回

当然,这种方案也可以搞成缓存js对象的版本
------解决方案--------------------
查询缓存,如果数据不是改变频繁的话下面几种方法吧.

1.直接开启"hibernate"的查询缓存就行了.

2.使用lucene来存放数据的ID列表,以此代替数据库的列表查询.

3.使用OSCache或者其他缓存实现,将查询的ID列表放到缓存中,和第2种一样其实只是换个存放点.当然如果数据量较大,可以拆分每个List的大小,分成几个list来存放.

以下都只是针对原始数据的缓存,如果是页面又不改变数据那最简单不过了,按页缓存或者直接生成静态化.