批量分页查询问题?

在持久层,需要获得总记录数和所有满足条件的主键集合,返回到表示层.对于记录较多的查询,同样会很慢.
在表示层,翻页时是依据主键到缓存中查询,没有则到数据库中查.这就有三个问题:
1、按主键到数据库查询,会增加与数据库的交互次数。
2、缓存中的数据如何和数据库中的数据保持同步,确保查询的是数据库数据的真实情况。
3、如果批量查询比较多,那缓存对系统资源的开销将会很大,使中间件的资源不足,使系统性能下降很快。

请问您的缓存是如何实现的?原理是什么?

请指点,谢谢。

Bitter Java中文版 第5章 缓存 没有缓存的BBS讲解得比较详细:
http://www.china-pub.com/computers/common/info.asp?id=28933

可以说没有缓存的系统不成为系统。

>按主键到数据库查询,会增加与数据库的交互次数。
第一次是慢,但是第二次以后会更快,而且第一次调用Jsp也会很慢,所以和Jsp慢混淆在一起,用户基本感受不到。

>2、缓存中的数据如何和数据库中的数据保持同步,确保查询的是数据库数据的真实情况。
更新是门学问,缓存难就难在更新。粒度更新越细,利用效率高,所以缓存一般是结合业务的状态一起设计的。

>3、如果批量查询比较多,那缓存对系统资源的开销将会很大,使中间件的资源不足,使系统性能下降很快。
根据你的查询量限定缓存大小,通过缓存管理,有各种算法:如先进先出等,将不常用的数据从缓存去除,通过缓存击中率来调整tuning缓存大小,根据你业务缓存情况决定你的硬件内存大小,而不是由硬件内存大小决定软件设计,硬件内存已经扩展64位计算,成本越来越低,分布式缓存计算产品也日益成熟,EJB就是一个分布式缓存。

对于查询来说,并不是所有的查询结果都可以用某个表的主键来标识其每条结果的唯一性.两个问题:
1、如果结果集中没有唯一标识如何处理。
2、如何告诉PageIterator那个或那些是唯一标识ID。

>所有的查询结果都可以用某个表的主键来标识其每条结果的唯一性
这个有一个习惯制约,正如Hibernate缺省要求每个POJO有一个主键一样,Jdon框架也要求每个Model有一个Object ID,每个系统中都有一个全局ID产生器,这已经是开发习惯和规律了,为每个POJO标记一个内部标识可以有很多好处,特别是性能,为何不做呢?