2008-03-25
S2Dao 实现分页的一些经验
关键字: s2dao
S2Dao是seasar下面的一个字项目,使用annotation + interface的方式实现了dao层。下面是给公司做培训时所写文章的节选。主要是分页底层的一些使用方法。公司项目的架构采用了s2struts+s2dao+seasar。s2struts和seasar部分在分页上的实现因为该项目设计上的特殊性,没有广泛代表意义,就没帖出来了。
1:底层的实现原理。
S2Dao中,只需要传入DAO函数的参数实现了PagerConditon这个interface,再加上j2ee.dicon里面的配置,在dao层就自动提供了分页功能。PagerCondtion的用处是用于提供分页所需要的必要信息,以及返回分页查询后所附带的一些信息,其中需要提供的信息有limit,offset,返回的信息有count.
Offset:本次查询从那条数据开始。
Limit:一次查询返回的结果数。
Count:查询结果的记录总数量。
S2Dao本身提供一个类叫DefaultPagerCondition,该类实现了PagerCondition。算是分页的默认实现。
S2Dao分页在Jdbc层的实现有2种
1:利用Jdbc中ResultSet的滚动游标实现。
2:利用数据库的特有功能实现。Oracle支持rowNum,MySql和PostgreSQL支持的Limit,Offset.
其中的配置可以参考http://s2dao.seasar.org/ja/s2pager.html,这里就不详细介绍了。这里介绍下这2者之间的区别。
1:使用ResultSet的滚动游标来实现分页。有些数据库并不支持这个功能,比如我们项目的oracle10g,所以查询的时候虽然返回的记录条数是limit限制了的,不过实际上查询会把所有的记录都返回到内存里面,如果有10w条记录,很可能就出现内存泄漏的情况。所以就这个意义上来说,使用ResultSet的分页已经失去了原有的意义。
2:数据库的特有支持。我们的项目使用的是oracle10g。所以最后采用了rowNum的方法。
S2Dao会包装你原有的Sql语言,将原来的一句SQL变成三句SQL,发送给数据库。具体的实现可以参考 OracleRownumPagingSqlRewriter。因为原来的一句语言变成了三句SQL,所以采用这种分页有可能降低查询的效率。你可以参考OracleRownumPagingSqlRewriter实现自己的AbstractPagingSqlRewriter来优化效率。比如我们的项目中就定义了自己的rowNum查询语言,引入了with语句。
1:底层的实现原理。
S2Dao中,只需要传入DAO函数的参数实现了PagerConditon这个interface,再加上j2ee.dicon里面的配置,在dao层就自动提供了分页功能。PagerCondtion的用处是用于提供分页所需要的必要信息,以及返回分页查询后所附带的一些信息,其中需要提供的信息有limit,offset,返回的信息有count.
Offset:本次查询从那条数据开始。
Limit:一次查询返回的结果数。
Count:查询结果的记录总数量。
S2Dao本身提供一个类叫DefaultPagerCondition,该类实现了PagerCondition。算是分页的默认实现。
S2Dao分页在Jdbc层的实现有2种
1:利用Jdbc中ResultSet的滚动游标实现。
2:利用数据库的特有功能实现。Oracle支持rowNum,MySql和PostgreSQL支持的Limit,Offset.
其中的配置可以参考http://s2dao.seasar.org/ja/s2pager.html,这里就不详细介绍了。这里介绍下这2者之间的区别。
1:使用ResultSet的滚动游标来实现分页。有些数据库并不支持这个功能,比如我们项目的oracle10g,所以查询的时候虽然返回的记录条数是limit限制了的,不过实际上查询会把所有的记录都返回到内存里面,如果有10w条记录,很可能就出现内存泄漏的情况。所以就这个意义上来说,使用ResultSet的分页已经失去了原有的意义。
2:数据库的特有支持。我们的项目使用的是oracle10g。所以最后采用了rowNum的方法。
S2Dao会包装你原有的Sql语言,将原来的一句SQL变成三句SQL,发送给数据库。具体的实现可以参考 OracleRownumPagingSqlRewriter。因为原来的一句语言变成了三句SQL,所以采用这种分页有可能降低查询的效率。你可以参考OracleRownumPagingSqlRewriter实现自己的AbstractPagingSqlRewriter来优化效率。比如我们的项目中就定义了自己的rowNum查询语言,引入了with语句。
评论
20062633
2008-07-03
感觉很不错!不过我的看法都是一般不要用数据库上的一些特有功能。分页其实自己实现也不错撒!系统和数据库要做到完全无关啊!
cindy_taozhiang
2008-03-28
哎.本来就茫茫然了 又看到最后的几句,,,就完全没的兴趣了
使用ResultSet的滚动游标来实现分页。有些数据库并不支持这个功能,比如我们项目的oracle10g,所以查询的时候虽然返回的记录条数是limit限制了的,不过实际上查询会把所有的记录都返回到内存里面,如果有10w条记录,很可能就出现内存泄漏的情况。所以就这个意义上来说,使用ResultSet的分页已经失去了原有的意义。
2:数据库的特有支持。我们的项目使用的是oracle10g。所以最后采用了rowNum的方法。
S2Dao会包装你原有的Sql语言,将原来的一句SQL变成三句SQL,发送给数据库。具体的实现可以参考 OracleRownumPagingSqlRewriter。因为原来的一句语言变成了三句SQL,所以采用这种分页有可能降低查询的效率。你可以参考OracleRownumPagingSqlRewriter实现自己的AbstractPagingSqlRewriter来优化效率。比如我们的项目中就定义了自己的rowNum查询语言,引入了with语句
使用ResultSet的滚动游标来实现分页。有些数据库并不支持这个功能,比如我们项目的oracle10g,所以查询的时候虽然返回的记录条数是limit限制了的,不过实际上查询会把所有的记录都返回到内存里面,如果有10w条记录,很可能就出现内存泄漏的情况。所以就这个意义上来说,使用ResultSet的分页已经失去了原有的意义。
2:数据库的特有支持。我们的项目使用的是oracle10g。所以最后采用了rowNum的方法。
S2Dao会包装你原有的Sql语言,将原来的一句SQL变成三句SQL,发送给数据库。具体的实现可以参考 OracleRownumPagingSqlRewriter。因为原来的一句语言变成了三句SQL,所以采用这种分页有可能降低查询的效率。你可以参考OracleRownumPagingSqlRewriter实现自己的AbstractPagingSqlRewriter来优化效率。比如我们的项目中就定义了自己的rowNum查询语言,引入了with语句
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 921 次

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
S2Dao 实现分页的一些经验
感觉很不错!不过我的看法都是一般不要用数据库上的一些特有功能。分页其实自己实现也 ...
-- by 20062633 -
项目一期结束后的思考。怎 ...
我的项目是使用嵌入Tomcat 在debug模式下可以实现热部署,但是有些文件的 ...
-- by wufan0023 -
S2Dao 实现分页的一些经验
哎.本来就茫茫然了 又看到最后的几句,,,就完全没的兴趣了 使用Resu ...
-- by cindy_taozhiang -
项目一期结束后的思考。怎 ...
auauau 写道javarebel 现在正在用,感觉启动速度慢了一倍,不过调试 ...
-- by mmwy -
项目一期结束后的思考。怎 ...
javarebel 现在正在用,感觉启动速度慢了一倍,不过调试的效果还不错。我采 ...
-- by auauau






评论排行榜