关于分页显示的问题!

04-08-28 xuesenlin
分页显示有两种做法:一种是把所有的资料都查询出来,然后在页面中显示指定的资料;另一种是多次查询数据库,每次只获得本页的数据。

当然选择第一种代码就比较好写,同时也有既支持 Mysql又支持Ms SQL server 2000 的 SQL语句,比如:

ps=con.prepareStatement (selectSQL,ResultSet.TYPE_SCROLL_INSENSITIVE,

ResultSet.CONCUR_READ_ONLY);

而第二种做法就比较麻烦了, 但是 在 Mysql 中和 Ms SQL server 2000中的SQL 语句 不一样,在Mysql 中用 ...limit N M ,,而Ms SQL server 2000 中用 top 也可以 ,问题是在什么情况下选择那种!我看到一段论文说::“考虑到数据往往是大量的甚至是海量的,如果一次性获取,那么这些数据必然会占用服务器大量的内存资源.” 到底"海量"是多大的呀,,? 千万条数据吗?这是一个问题!!

第二个问题是: 我想找一种折中的方法, 即用第二种方法查询数据库,但是 又要一个 既支持 Mysql 也支持 MS SQL server 2000 database的 SQL 语句 或是 什么好的方法?????

大家能不能提供一个好的方法ne ? 谢谢了,,,,

banq
2004-09-04 17:08
怎么能用第一种方法,万一数据巨大怎么办,你的Java系统就立即变慢。

批量查询参考Jive做法,配以缓存实现即可。

jsjjf
2004-09-07 12:45
我这两天也在为这个问题烦恼呢

不知道JIVE的缓存方法是如何实现的呢?

对于海量数据第一种方法肯定行不通,如果用第二种方法的有很失一般性

就是可能把程序做死了,如果换一种数据库的话,sql语句又要重新写了

如:把oracle的“rownum”改称sqlserver的limit

mysapphire
2004-09-07 15:53
JIVE方法是最好的一中解决思路,不过一般情况下你不必去那么实现它,毕竟写起来太累,要么就用现成的。 你说的第二种方法比较可取,一般分页都这么做的,其实你可以做得到通用的,毕竟数据库就那么几种嘛,自己写一个专门处理SQL语句分页的类不就行了? 再设定一个持久的全局配置参数来指明你现在用的是什么数据库。

vegetable318
2004-09-08 16:53
对于多个数据库的,楼主可以参考petstore的dao模式,,dao的具体实现是针对不同的数据库的,至于分页,楼主可以考虑,每次取几页的数据,存放在session,如果是同一个查询的get操作就直接从session中取值,如果是post操作,或者是get操作需要从新查询的,,就在调用该数据库查询操作,如果偏离了这个操作,可以清空session的内容,这样也不会有session占用太大资源的问题,当然此问题存在一个浏览器后退的问题,如果是这样,可是根据是不是上次的操作条件重新查询,这个关键就是判断你所执行的get操作到底是查询数据库还是取session的东东了.

laoer
2004-09-10 08:50
还是根据不同数据库用不同的分页SQL,这个我已经实现了,可以看我的程序,http://www.laoer.com

我的想法和Hibernate的方法基本是一致的。

banq
2004-09-10 12:45
>还是根据不同数据库用不同的分页SQL

我不赞成,这样丧失了J2EE基本原理:可移植性。现在是完全可以做出与具体数据库无关的分页显示框架,我的JdonSD是其中,我看到也有不少人写出来。

xuesenlin
2004-10-16 17:12
怎么我的帐号没了?

leema
2004-10-28 11:15
用Hibernate的HQL写,安全省事又不失可移植性。

如:

select new City(city.id, city.name, province)
from com.meetingnet.model.City as city
 left join city.province province
order by province.id, city
<p>

可直接获得List,而不需要一条一条读出来再Set。

dabb
2004-10-29 10:58
bang,能说说你实现的原理吗?我想不出有哪种方法可以是完全通用的,无非是在数据库之前在加一个针对各种数据库的解析层,

就象用hsql这种东西也是有可能碰到hibernate不支持的数据库(当然大多数主流数据库是可以的)。翻页的实现方式看需求,一般都用你说的第二种方法。还有就是折中的方法,就是一次取几页的数据,就象lucene的实现思想一样,如果取前100条的记录能够满足百份之80-90%的需求,那这样做就可以减少对数据库的访问请求。

ahu0707
2004-10-29 15:03
赞成楼上的观点,相对而言,满足大多数,而且也不会浪费太多的资源、兼顾了速度,中国特色嘛!一些特殊的客户有特殊的需求很正常,这样就要削足适履,特殊对待。^_^^_^^_^^_^

anonymous
2004-11-18 10:40
dao前架个接口。我是采用ioc形式,来实现的。

Juniper
2004-11-18 13:52
楼主的第一种方式(即:返回可滚动的ResultSet)比较适合小数据量的分页查询---

而对于大数据量的查询,我一般就使用第二种方式。

Hibernate分页时很方便,会直接返回给你一个List.你直接枚举即可。如果你看过Hibernate分页的源码就会发现:

Hibernate会优先尝试使用"sql语句分页",如果遇上了一种不被支持的DB,就会使用jdbc游标。

有时,所谓的“可移植性”并不是象一些人说得那么important..这就好比:我明明知道我的飞机不会改期,我为什么还要去买一张可以改期的飞机票?我没有见过有多少客户选定了解决方案以后还要求更换数据库的,起码在运行期间的几年之内不会(只 数据转移/备份 就是一项十分痛苦的工作)。

如果非要强调“可移植性”,那么"sql语句分页"的每种不同的DB有不同的实现,你可以把这一层单独包装起来,专门针对不同的DB返回不同的SQL查询语句-----或许你感觉这些工作比较枯燥,那你可以试试Hibernate,它已经帮你搞定了一大半。

猜你喜欢