jdbc scrollable resultset

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删除,是读取不到的,
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();


当如果已经读取到数据,不会再去二次查询
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));
        }

你可能感兴趣的:(ResultSet)