[Brave]Java数据访问层如何实现通用不依赖第三方的产品化分页

03-11-27 Brave
Java数据访问层如何实现通用不依赖第三方的产品化分页?如何实现?怎么样更好?PetStore的方式觉得如何?如果选择PetStore的方式,您觉得她哪里不好?

因为具有产品化特点,请比较挑剔的帮我想想吧,这里先谢谢了!

说明:
1:问题的关键是通用和不依赖第三方,也就是让绝大部分人满意;
2:尽可能的给出设计甚至代码作参考更好;
3:请详细的评论各种实现的好坏;
4:可以给出参考哪些具体的东西,但希望有很好的水准的实现。

iceant
2003-11-28 13:09
看起来像某个产品的需求,你准备 pay 多少 money for this solution?

banq
2003-11-28 13:27
这个产品我已经实现,相关原理可见我的书籍“Java实用系统开发指南”一书,该产品是J道数据通用操作框架的一部分,原理如下:

EJB层使用DAO模式实现下列三个功能
1. 获得整个数据表记录总数。
2. 获取符合查询条件的所有数据ID集合。
3. 根据ID查询获取某个完整数据对象记录。

Web层基于Struts,分别实现下列功能
1. Action中对所有数据ID集合实现遍历时,根据ID获取完整数据对象,最后形成数据对象集合,保存在ActionForm中。
2. 使用标签库显示多页,标签库主要从ActionForm中获取相关信息。
3. Jsp页面显示,使用loigc:iterator 从ActionForm数据对象集合中遍历数据对象。

在Web层实现数据对象缓存,原理:
根据ID获得完整数据对象的实现方法:
1.查询缓冲;
2. 如果没有,再根据ID读取数据库。

如果一个数据对象第二次被查询,它的数据将不再通过后台EJB获取,提高了查询性能。

该产品已经经过性能并发测试,应用在多个OA系统中,需要和我联系。哈,做广告了。

Brave
2003-11-29 03:38
banq的书出来了吗?里面有详细的说明以及实际代码吗?

我目前暂时实现为简单的 PetStore 的分页方式,将来会提供多种分页方式的选择,包括:Data List模式和您说的这个方法(会结合快速查询实现)。还请多指教,如果有代码框架就好了。呵呵,要求有点过分呢。不过久仰大名,怎么舍得不问您呢。呵呵。

Brave
2003-11-29 03:39
Pay?呵呵,你要是在这里啊,我请客吃饭好了。其他的,呵呵,我也是穷光蛋啊,而且,这是业余的项目呢。呵呵。

agilejava
2003-11-29 14:47
banq,你的书在哪里可以买到,已经发行了吗?很期望看到啊!

iceant
2003-11-29 15:14
不想 Pay 那简单啊~~ 自己搞清楚逻辑与算法,然后实现一个咯。
既然是不依赖第三方产品的分页实现,那肯定不能用到数据库的特性,对于某些数据库来说,这肯定要失去一定的性能咯。想一想,你可能只有在语言级来实现这个目的。好在 JAVA 有 JDBC 做协议,各厂商都有一定程度的支持,所以,这里免去了 connection 的麻烦。

那剩下的无非就是想办法知道一个 Query 有多少 records, page size 是多少,算一算就知道该分多少 page, 每个page range 的开始与结束 offset. 再复杂一点的就是加上点 cache 机制咯,同一个 query condition 的直接返回相应的 records. 不过要记得更新就是了,要是你不想自己写这种 cache, 用 poolman 就好了。打开 cache 设置,它帮你完成。当然,你要准备大一点内存。

理论就那么多,具体实现的可维护性,可扩展性以及稳定性等方面就看功底咯~~

饭就免了~~ 我还要减肥~~

crogers
2003-11-29 15:56
haha,你还要减肥啊,faint你啊~~~~~

通用的东西,想法是好,关键还是中间会牺牲多少其他的东西
比如,jvm多好,同时,也牺牲了不少性能,^_^~

Brave
2003-11-29 17:46
iceant:不会吧?你是女生啊?还要减肥?

banq
2003-11-30 16:20
>banq的书出来了吗?里面有详细的说明以及实际代码吗?
多谢关心,出版社效率差,这一两个月会出。

petstore的那种方式在反复查询时,都需要访问后台EJB,性能不算最好,我使用的CACHE是在Web层,越在前面,性能越好。类似Jive的批量查询。

wys1978
2003-11-30 18:13
你可以参考hibernate,针对不同的数据库,使用不同的实现,比如mysql 用 limit,Oracle用rownum,对于没有特殊分页sql的数据库,则采用resultset 定位。

hibernate可以满足你提出的这几点要求。

Brave
2003-11-30 22:10
To wys1978:
Hibernate实现分页查询的实现,是很好的做法,在具体的实现上也是很好的参考,但暂时不采用每种数据库均各自绑定实现的方式进行,一方面没时间,一方面不怎么希望和具体的数据库绑定。
SonyMusic朋友的一个简捷的可分页的ResultSet实现 也是很好,但暂时没有很好的领会和掌握,同时Yipsilon朋友也写了类似的东西,也不知道采用谁的更好和不知道别人是否喜欢这样的封装(因为我的定位是尽量少使用非 J2SE 自带的API,避免第三方的API的混合使用),同时如果采用SonyMusic朋友的方式,在整体的风格上会和基本的ResultSet混淆,所以,暂时拿不定主意。
目前基本的想法是提供List接口形式的值返回或者采用 PetStore 的 Page 类作分页的实现。当然,还需要测试和考虑在上面封装扩展的方便性,如在使用 next() 方法的时候对后面数据的访问。

有其他的想法,请多指教,请非常挑剔的说,因为定位是产品性质的。

BTW,我这里强调的是在数据访问层的实现,所以,banq的方式似乎超出我的问题范围,当然很值得参考(如果有实际的代码框架更好,以免误会您的意见,等您的大作。^_^ ^_^),这里更多的强调对外提供的接口或者对象的封装,需要自然而且确实实现得好。

laoer
2003-12-01 12:14
THIS MESSAGE HAS BEEN MASKED

jaghuang
2003-12-01 16:30
不知道是不是我理解错误了
我搞不懂为什么要依靠第三方的东西?