package study.java.database.oracle;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class PagingModeCompare{
public static void main(String[] args) throws Exception {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@10.1.193.120:1521:DB1", "md", "md");
long a = System.currentTimeMillis();
testPageQuery1(conn,100);
//testPageQuery2(conn,100);
//[{1,000,000:110535, 100,000:10915, 10,000:1345, 1,000:301, 100:180}]
//[{1,000,000:660, 100,000:121, 10,000:94, 1,000:91, 100:88}]
long b = System.currentTimeMillis();
System.out.println(b-a);
/*
对比结论:
testPageQuery1方法是用ibatis采用的分页方法查询,
testPageQuery2是用Hibernate采用的分页方法查询,
发现testPageQuery1需要执行十几秒,而testPageQuery2仅需要执行零点几秒,差异很大。
而如果改成从1000条开始取100条,甚至更靠前,则2者的差别是非常小的。
如果系统中查询的数据量很大,并且用户会选择查询非常靠后的数据,那么我们就应该替换iBatis的分页实现,
如果不存在这种情况,那我们就不需要替换iBatis的分页实现,一般情况下,用户不可能去查询那么靠后的页,
这也是iBatis一直不修改分页实现的原因吧。
*/
}
/**
* ibatis采用的分页方式,
* @param conn
* @throws Exception
*/
public static void testPageQuery1(Connection conn,long startNum) throws Exception{
String sql = "select * from ca_loy_member_info,visitlist ";
/**
* 1.ResultSet.TYPE_FORWARD_ONLY,只可向前滚动;
* 2.ResultSet.TYPE_SCROLL_INSENSITIVE,双向滚动,但不及时更新,就是如果数据库里的数据修改过,
* 并不在ResultSet中反应出来。 (rs.absolute直接定位方法可用)
* 3.ResultSet.TYPE_SCROLL_SENSITIVE,双向滚动,并及时跟踪数据库的更新,以便更改ResultSet中的数据。(rs.absolute直接定位方法可用)
* 4.ResultSet.CONCUR_READ_ONLY 该常量指示不可以更新的 ResultSet 对象的并发模式。
* 5.ResultSet.CONCUR_UPDATABLE 该常量指示可以更新的 ResultSet 对象的并发模式
*/
Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery(sql);
int j=0;
//游标移动到1000001条数据的位置
while(rs.next() && j++<startNum){
}
int i=0;
//依次取出100条数据
while(rs.next() && i++<100){
}
}
/**
* hibernate采用的分页方式
* @param conn
* @throws Exception
*/
public static void testPageQuery2(Connection conn,long startNum) throws Exception{
String startNumS = String.valueOf(startNum);
String endNumS = String.valueOf(startNum+100);
String sql = "select * from ca_loy_member_info,visitlist ";
StringBuffer pagingSelect = new StringBuffer( sql.length()+100 );
pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( ");
pagingSelect.append(sql);
pagingSelect.append(" ) row_ where rownum <= "+ endNumS + ") where rownum_ > " + startNumS);
Statement stmt = conn
.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery(pagingSelect.toString());
while(rs.next()){
}
}
}