JDBC2.0实现数据分页
分页操作在我们生成数据表格中是一个必不可少的步骤。不同于.net程序的封装,在java程序中,我们必须要通过代码实现或者通过某些提供这个功能的类库。这次进行PDM Report的实现中对直接使用JDBC进行分页进行了一些学习,把这些东西写下来,希望对大家会有一些帮助。
一、实现方法
在JDBC2.0中对於Oracle和Sql Server都有三种方式实现分页操作。分别是:
1、使用针对特定数据库的SQL语句。
例如在Oracle中的
select ida
在Sql Server中的
select top 50 * from (select top 54134 ida
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 server和Oracle的数据库进行了一下简单测试。对应于两台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 Server在Hibernate中並不支持偏移操作,也就是说会进行absolute方法,这样一来他的分页效率就比较让人担心了。如果大家有人使用Sql Server + Hibernate,请注意这一点。






