创建Statement对象时TYPE_SCROLL_INSENSITIVE的用法是什么

时间:2015-01-24 12:34:29

标签: java mysql jdbc database-connection resultset

JavaDoc说:"该常量指示ResultSet对象的类型,该对象可滚动但通常对ResultSet基础数据的更改不敏感。 。

我清楚可滚动部分,但对声明的后半部分有疑问。 我正在使用以下代码片段来验证我的理解。

        conn = getConnection();
        Statement stmt = conn
                .createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                        ResultSet.CONCUR_UPDATABLE);

        String query = "select * from vehicle";
        ResultSet rs = stmt.executeQuery(query);

        rs.absolute(2);
        System.out.print(rs.getString(2));
        System.out.println("Waiting........");
        Thread.sleep(20000); //1 manually changed database entry
        rs.refreshRow();
        System.out.println(rs.getString(2));//2 Surprisingly changes is reflected

在评论1中,我在数据库中进行了手动更改,然后调用了rs.refreshRow()方法。在此之后在注释2中,当我访问第二列的值时,然后令人惊讶地反映了第二列的值的变化。根据我的理解,这种变化不应该反映出来,因为它对其他人所做的更改不敏感(根据JavaDoc)。谁能解释一下我的实际用途是什么?

1 个答案:

答案 0 :(得分:1)

前一段时间我对此进行了调查,特别是关于MySQL Connector / J.据我所知,设置ResultSet.TYPE_SCROLL_SENSITIVEResultSet.TYPE_SCROLL_INSENSITIVE实际上并没有影响从MySQL检索数据时的行为。

我发现的几个类似的问题和博客文章提到了MySQL Connector / J文档,其中JDBC API Implementation Notes部分说明了

  

默认情况下,ResultSet完全检索并存储在内存中。在大多数情况下,这是最有效的操作方式,并且由于MySQL网络协议的设计,更容易实现。

继续讨论使用ResultSet.TYPE_FORWARD_ONLYResultSet.CONCUR_READ_ONLYstmt.setFetchSize(Integer.MIN_VALUE);作为“驱动程序逐行传输结果集的信号”,但即便如此case我的测试显示,我stmt.executeQuery(...)时仍然检索到整个ResultSet。 (虽然我可能错过了MySQL Connector / J文档的那一部分中没有明确提到的其他连接设置。)

最后我得出的结论是ResultSet.TYPE_SCROLL_[IN]SENSITIVE设置在MySQL Connector / J下确实没有任何区别。虽然简单地滚动ResultSet,但它似乎总是像INSENSITIVE一样(忽略其他进程对现有行所做的任何更改),但rs.refreshRow();始终返回最新数据(包括由其他进程)好像它是SENSITIVE,即使ResultSet应该是INSENSITIVE