jdbc 的resultset有三种cursor类型:
ResultSet.TYPE_FORWARD_ONLY:表示cursor只能向前移动,absolute first last等方法无效。
ResultSet.TYPE_SCROLL_INSENSITIVE:表cursor可以自由移动,但对于修改不敏感
ResultSet.TYPE_SCROLL_SENSITIVE:表cursor可以自由移动,但对于修改敏感
TYPE_SCROLL_INSENSITIVE 如何实现:
jdbc驱动在实现TYPE_SCROLL_INSENSITIVE会将sql语句的结果存在JVM的cache中,(数据库的cursor是不支持absolute之类的操作的),absolute first last等方法其实就是在缓存中来定位而已,由于数据已经全部取到jvm端,此时再去修改数据库,得到的数据是不会改变的。
TYPE_SCROLL_SENSITIVE:与TYPE_SCROLL_INSENSITIVE的区别在于,不是缓存结果,而是缓存rowid,需要用到时再去查询,这样就会造成二次查询
如果未读取数据,将表的row删除,是读取不到的,
当如果已经读取到数据,不会再去二次查询
[code]
ResultSet rs = p1.executeQuery();
while(rs.next()){
System.out.println(rs.getInt(1)+" "+rs.getString(2));
}
Thread.currentThread().sleep(10000);//修改数据
rs.beforeFirst();
while(rs.next()){
System.out.println(rs.getInt(1)+" "+rs.getString(2));
}
[/code]
ResultSet.TYPE_FORWARD_ONLY:表示cursor只能向前移动,absolute first last等方法无效。
ResultSet.TYPE_SCROLL_INSENSITIVE:表cursor可以自由移动,但对于修改不敏感
ResultSet.TYPE_SCROLL_SENSITIVE:表cursor可以自由移动,但对于修改敏感
TYPE_SCROLL_INSENSITIVE 如何实现:
jdbc驱动在实现TYPE_SCROLL_INSENSITIVE会将sql语句的结果存在JVM的cache中,(数据库的cursor是不支持absolute之类的操作的),absolute first last等方法其实就是在缓存中来定位而已,由于数据已经全部取到jvm端,此时再去修改数据库,得到的数据是不会改变的。
TYPE_SCROLL_SENSITIVE:与TYPE_SCROLL_INSENSITIVE的区别在于,不是缓存结果,而是缓存rowid,需要用到时再去查询,这样就会造成二次查询
如果未读取数据,将表的row删除,是读取不到的,
Driver driver = new oracle.jdbc.driver.OracleDriver();
DriverManager.registerDriver(driver);
Connection conn = DriverManager.getConnection(url,user,password);
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
conn.setAutoCommit(false);
PreparedStatement p1 = conn.prepareStatement("select * from test",ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
Thread.currentThread().sleep(10000);//此时更改数据,或者删除行 查看结果
ResultSet rs = p1.executeQuery();
while(rs.next()){
System.out.println(rs.getInt(1)+" "+rs.getString(2));
}
conn.commit();
当如果已经读取到数据,不会再去二次查询
[code]
ResultSet rs = p1.executeQuery();
while(rs.next()){
System.out.println(rs.getInt(1)+" "+rs.getString(2));
}
Thread.currentThread().sleep(10000);//修改数据
rs.beforeFirst();
while(rs.next()){
System.out.println(rs.getInt(1)+" "+rs.getString(2));
}
[/code]
本文详细介绍了JDBC中ResultSet的三种游标类型:仅向前、可滚动但不敏感于修改、可滚动且敏感于修改。解释了每种类型的实现原理及应用场景,并通过示例代码展示了不同游标类型的行为差异。
806

被折叠的 条评论
为什么被折叠?



