java - 创建 Statement 对象时 TYPE_SCROLL_INSENSITIVE 的用途是什么

标签 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 之后,当我访问第二列的值时,第二列的值发生了惊人的变化。根据我的理解,不应反射(reflect)此更改,因为“它对其他人所做的更改不敏感”(根据 JavaDoc)。谁能解释一下它的实际用途是什么?

最佳答案

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

我发现几个类似的问题和博客文章提到了 MySQL Connector/J 文档,在关于 JDBC API Implementation Notes 的部分中上面写着

By default, ResultSets are completely retrieved and stored in memory. In most cases this is the most efficient way to operate and, due to the design of the MySQL network protocol, is easier to implement.

它继续讨论使用 ResultSet.TYPE_FORWARD_ONLYResultSet.CONCUR_READ_ONLYstmt.setFetchSize(Integer.MIN_VALUE); 作为“向驱动程序发出逐行流式传输结果集的信号”,但即使在那种情况下,我的测试表明,只要我执行 stmt.executeQuery(...)<,整个 ResultSet 仍会被检索。 (尽管我可能遗漏了一些其他连接设置,这些设置在 MySQL Connector/J 文档的该部分中未明确提及。)

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

关于java - 创建 Statement 对象时 TYPE_SCROLL_INSENSITIVE 的用途是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28125502/

相关文章:

java - 串联sql语句插入

java - 获取对象实例?

MySQL 错误 : Table 'table' doesn't exist in engine

sql-server - 通过 JDBC 连接到不同域上的 SQL Server

MySQL View 和索引使用

mysql - 能够从表中选择,但不能计算行数

java - MariaDB JDBC 客户端日志记录

java - Android 中的过滤数组

java - Mockito:在另一个方法中模拟方法调用

java - Rsync 命令在 Java 中不起作用