考虑我在数据库中的以下客户表:
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”中描述),从而始终更新数据 新窗口。因此外部更新不会立即可见 在滚动敏感的结果集中;他们只有在看到之后才能看到 刚刚描述的自动反映。
但我无法理解我应该在代码中对此笔记做出哪些更改。
感谢任何帮助!
答案 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关于使用此方法的性能警告来结束:
由于这种反馈不是一种高效或优化的方法,因此存在重大的性能问题。在使用当前实现的滚动敏感结果集之前,请仔细考虑。