敏感可滚动结果集不反映Oracle数据库中的数据库更改

时间:2015-08-23 02:32:06

标签: java sql oracle jdbc

考虑我在数据库中的以下客户表:

custId        customerName         emailId
1001            James             jAMES@Xyz

考虑以下代码行:

 String sql="select t.custId,t.customerName,t.emailId from customer t";    
       Connection connection = DriverManager.getConnection(DBConnectionURL,DBUserName, DBPassword);
        PreparedStatement pStatement = connection.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
        ResultSet scrollableResultSet = pStatement.executeQuery();
            System.out.println("Initial cursor position : "+ scrollableResultSet.getRow()); //line 1
scrollableResultSet.next();
System.out.println("Customer Name : "+ scrollableResultSet.getString("customerName"));
        String sql1 = "UPDATE customer SET customername=? where custid=?";
                    PreparedStatement pStatement1 = connection.prepareStatement(sql1);
                    pStatement1.setString(1, "Ramesh");
                    pStatement1.setInt(2, 1001);
                    int row = pStatement1.executeUpdate();
                    pStatement1.execute("COMMIT");

scrollableResultSet.beforeFirst();
scrollableResultSet.next();
System.out.println("Customer Name : "+ scrollableResultSet.getString("customerName")); //line 2

在上面的代码中,'第1行'应该显示输出为“James”,'第2行'应该将输出显示为'Ramesh',但两者都显示输出为'James'。

为什么结果集没有感知到数据库的变化?

我提到了以下链接 http://docs.oracle.com/cd/B10501_01/java.920/a96654/resltset.htm

发现我们可以在执行查询后使用结果集的getType()方法来查找用于执行查询的结果集类型,但我很惊讶地发现它给了我输出为1005这意味着我正在使用'Scrollable sensitive'结果集。

我还在此链接上找到了如下注释:

http://docs.oracle.com/cd/B10501_01/java.920/a96654/resltset.htm#1023726

  

每当重新定义窗口时,数据库中的N行   对应于新窗口中的行是自动的   通过对refreshRow()方法的隐式调用来重新获取   (在“Refetching Rows”中描述),从而始终更新数据   新窗口。因此外部更新不会立即可见   在滚动敏感的结果集中;他们只有在看到之后才能看到   刚刚描述的自动反映。

但我无法理解我应该在代码中对此笔记做出哪些更改。

感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

refreshRow()方法属于类oracle.jdbc.driver.UpdatableResultSet。因此,将结果集转换为此类,调用方法,您应该能够看到更新的行:

scrollableResultSet.beforeFirst();
scrollableResultSet.next();
((oracle.jdbc.driver.UpdatableResultSet)scrollableResultSet).refreshRow();
System.out.println("Customer Name : "+ scrollableResultSet.getString("customerName")); //line 2

但是,我只能通过迭代Oracle关于使用此方法的性能警告来结束:

  

由于这种反馈不是一种高效或优化的方法,因此存在重大的性能问题。在使用当前实现的滚动敏感结果集之前,请仔细考虑。