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)。谁能解释一下我的实际用途是什么?
答案 0 :(得分:1)
前一段时间我对此进行了调查,特别是关于MySQL Connector / J.据我所知,设置ResultSet.TYPE_SCROLL_SENSITIVE
和ResultSet.TYPE_SCROLL_INSENSITIVE
实际上并没有影响从MySQL检索数据时的行为。
我发现的几个类似的问题和博客文章提到了MySQL Connector / J文档,其中JDBC API Implementation Notes部分说明了
默认情况下,ResultSet完全检索并存储在内存中。在大多数情况下,这是最有效的操作方式,并且由于MySQL网络协议的设计,更容易实现。
继续讨论使用ResultSet.TYPE_FORWARD_ONLY
,ResultSet.CONCUR_READ_ONLY
和stmt.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
。