java物理分页原理_java 物理分页和逻辑分页

A.逻辑分页利用游标分页,好处是所有数据库都统一,坏处就是效率低。

1.逻辑分页的第一种方式,利用ResultSet的滚动分页。这种分页方式依靠的是对结果集的算法来分页,因此通常被称为“逻辑分页”。步骤如下:

a.根据条件sql查询数据库。

b.得到ResultSet的结果集,由于ResultSet带有游标,因此可以使用其next()方法来指向下一条记录。

c.利用next()方法,得到分页所需的结果集。

2.逻辑分页的第二种方式,利用Scrollable ResultSets(可滚动结果集合)来快速定位到某个游标所指定的记录行,所使用的是ResultSet的absolute()方法。虽然和第一种方式区别不大,单效率比ResultSet滚动要好,但是absolute()方法并不是所有jdbc驱动都支持。

B.物理分页就是数据库本身提供了分页方式,如mysql的limit,好处是效率高,不好的地方就是不同数据库有不同的搞法。hibernate采用的是物理分页,mybatis默认采用逻辑分页(数据量大的时候会造成内存溢出),不过可以用插件或其他方式能达到物理分页效果。

1.ibatis中查询函数主要有queryForList 和 queryForPaginatedList,queryForPaginatedList 是逻辑分页,据说可以直接分页, 以至于在数据量大了的时候, 性能急剧下降, 根本不能使用.

2.(如项目2013年写的几个项目能达到物理分页效果)回到 queryForList, 如下调用可以取得queryEntities的全部数据:

List entities = entities = getSqlMapClientTemplate().queryForList("queryEntities", paramsMap);如果我们需要知道记录总数, 则需要:

List rowCount = getSqlMapClientTemplate().queryForList("getRowCount", paramsMap);

因此代码中需要在第一次执行queryEntities之前, 先执行getRowCount以取得记录数目. 而queryEntities由于采用了SELECT * FROM table WHERE condition LIMIT m OFFSET n 语法, 会自动跳过n个结果记录(0-based), 返回不超过m条记录. 这要求数据库支持, MySQL, Sqlite 可以. 注意, OFFSET n是在返回的结果集中跳过前n个.以上是简单的iBATIS物理分页的实现, 显然每次我们翻页的时候都要执行一次查询, 但是由于我们只取得LIMIT 条记录, 因此对服务器的内存消耗是固定的小尺寸. 这对浏览大记录集尤为有用.

3.利用数据库本身的一些特性来分页。即:利用了数据库对sql语法的优化,提高分页性能。

针对Oracle数据库,步骤如下:

a.根据所使用的数据库特性来组织sql进行分页。

b.每次跳转页面的sql查询都不相同。通用的sql分页方式,“限制行数结果集的倒序”分页,步骤如下:

(1).取得符合条件的所有结果集中可以唯一标识的Key值(通常是主键),并正向排序。

(2).利用数据库提供的特殊方法进行“最大结果集”的限制(在Oracle中使用rownum, sql server中使用top, mysql中使用limit...), 该“最大结果集”指包含当前所处页的所有记录数,“最大结果集”应该只包含惟一的Key值。

(3).对步骤(2)中的“最大结果集”进行逆序,并取得“显示当前页显示数量的结果集”,该结果集中只包含惟一的Key值。

(4).通过步骤(3)中所取得的Key值取得显示数据,该显示数据就是当前页应该显示的数据。

针对MySQL数据库,在MySQL数据库中offset关键字的意思是"越过",而limit关键字的意思是“限制”,利用这两者结合可轻松分页。

(1)取得符合条件的结果集,包含全字段。

(2)利用offset关键字越过一段结果集(被越过的结果集就是"(当前页 - 1) * 一页显示数")。

(3)利用limit关键字限制取得一段结果集(被限制取得的结果集就是一页显示数)

分页结论:

1.物理分页速度上并不一定快于逻辑分页,逻辑分页速度上也并不一定快于物理分页。

2.物理分页总是优于逻辑分页:没有必要将属于数据库端的压力加诸到应用端来,就算速度上存在优势,然而其它性能上的优点足以弥补这个缺点。

3.在分页工作前,有必要了解使用数据库本身的一些sql语句特点更好的分页

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值