您的位置:首页 >> 编程开发 >> Java >> 数据库 >> 正文
RSS
 

JDBC2.0实现数据分页

http://www.rdxx.com 04年02月08日 12:12 Blog 我要投稿

关键词: 分页 , JDBC , 数据 , JDB

JDBC2.0实现数据分页

分页操作在我们生成数据表格中是一个必不可少的步骤。不同于.net程序的封装,在java程序中,我们必须要通过代码实现或者通过某些提供这个功能的类库。这次进行PDM Report的实现中对直接使用JDBC进行分页进行了一些学习,把这些东西写下来,希望对大家会有一些帮助。

一、实现方法

JDBC2.0中对於OracleSql Server都有三种方式实现分页操作。分别是:
1
、使用针对特定数据库SQL
语句。
例如在Oracle中的
select ida2a2 from (select rownum r ,ida2a2 from phase) ss where ss.r > 54084 and ss.r <= 54134
Sql Server中的
select top 50 * from (select top 54134 ida2a2 from phase order by ida2a2) as a order by ida2a2 desc
2、使用ResultSet中的Next()方法。这个方法适用于所有的DB
        for(int i=0;i<54084;i++)

        {

          rs.next();

        }

        for(int i=0;i<50;i++)

        {

          rs.next();

        }

3、使用由JDBC2.0开始提供的absolute()方法,这个方法只有在
        rs.absolute(54084);

        for(int i=0;i<50;i++)

        {

          rs.next();

        }

二、数据比较

使用这三种方法我分别对Sql serverOracle的数据库进行了一下简单测试对应于两台DB上数据行数相同的两张表(phase),使用不同的分页方法,分别取前50笔数据和最後五十笔数据,操作结束后计算所用时间。该表共有54134行数据,两台DB运行于同一台pc。结果如下:

 

Sql for Oracle

Next for Oracle

Absolute for Oracle

Sql for Sql Server

Next for Sql Server

Absolute for Sql Server

First 50 row

0

0

32

78

78

703

Last 50 row

32

1515

1985

203

109

13875

First 50 row

0

0

31

78

94

468

Last 50 row

31

1703

2078

234

109

16719

First 50 row

0

0

31

78

78

453

Last 50 row

32

1578

2063

219

110

16813

从上面得粗率数据可以看出来使用特定的Sql语句在Oracle数据库中进行分页操作时最快的而且基本上不受数据行数大小的影响。之所以在表中的数据前50行显示时间为零,估计主要是受了cache的影响。其他两种方式的时间差距明显。

对於Sql Server情况有些不同,使用Next的方式竟然是最快的,让人难以理解。採用特定的Sql语句排序会受到行数的影响当时速度还可以忍受。

对於两种DB来説,absolute方法的代价都是难以接受的,大家以後还少用为妙。

另外,Sql Server好像並不支持把top 後面的参数作爲prepare statement的参数,这个地方也请大家注意一下(如果哪位发现其实並不是如此,请告诉我一声)。

 

PS:关於Hibernate

Hibernate中优先使用的是absolute方法。代码如下
if ( session.getFactory().useScrollableResultSets() ) {
  // we can go straight to the first required row
  rs.absolute(firstRow);
}
else {
  // we need to step through the rows one row at a time (slow)
  for ( int m=0; m<firstRow; m++ ) rs.next();
}

对於可以直接使用Sql语句进行分页操作的DB来説没有问题,但是Sql ServerHibernate中並不支持偏移操作,也就是说会进行absolute方法,这样一来他的分页效率就比较让人担心了。如果大家有人使用Sql Server + Hibernate,请注意这一点。


 
 
标签: 分页 , JDBC , 数据 , JDB 打印本文
 
 
  热点搜索
 
 
 



Valid XHTML 1.0 Transitional
Copyright ©2005 - 2008 Rdxx.Com,All Rights Reserved
收藏本页
收藏本站