ResultSet的Oracle JDBC性能

到目前为止,我一直在使用这样的查询我的数据库工作得非常好:

PreparedStatement prepStmt = dbCon.prepareStatement(mySql); ResultSet rs = prepStmt.executeQuery(); 

但后来我需要使用rs.first(); 为了能够多次迭代我的rs 。 所以我现在用

 PreparedStatement prepStmt = dbCon.prepareStatement(mySql,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); 

我的问题与两者的表现有关。 如果我使用第二个选项,我会失去什么? 使用第二个选项会对我到目前为止编写的代码产生任何负面影响吗?

PS:请注意,我的应用程序是一个使用后端Oracle 11g数据库的多用户,数据库密集型Web应用程序(在Weblogic 10.3.4上)。

谢谢大家的关注。

UPDATE

我的最大重新设置大小将小于1000行和15-20列

由于Oracle游标是仅向前结构,为了模拟可滚动游标,JDBC驱动程序通常需要将结果缓存在内存中,如果它希望能够确保在迭代时返回相同的结果结果第二次。 根据查询返回的结果的数量和大小,可能涉及应用程序服务器上消耗的大量额外内存。 另一方面,这应该意味着第二次迭代ResultSet应该比第一次更有效。

所需的额外内存是否有意义取决于您的应用程序。 你说最大的ResultSet将有1000行。 如果你认为每行是500字节(这显然取决于数据类型 – 如果你的ResultSet只有一堆数字,它会小得多,如果它包含一堆长描述字符串,它可能会大得多),1000行是每用户500 kb。 如果你有1000个并发用户,那只有500 MB的存储空间可能并不令人望而却步。 另一方面,如果你有100万个并发用户,那就是500 GB,这可能意味着你要买几台新服务器。 如果您的行是5000字节而不是500字节,那么您所说的是5 GB的RAM,这可能是应用程序服务器运行您的应用程序所需的大部分内存。

如果您正在使用可滚动性(第二个选项),请注意以下事项:

要点:因为任何可滚动结果集的所有行都存储在客户端缓存中,结果集包含许多行,多列或非常大的列的情况可能导致客户端Java虚拟机(JVM)失败。 不要为大型结果集指定可滚动性。

来源: Oracle数据库JDBC开发人员指南和参考