Java 结果集的Oracle JDBC性能

Java 结果集的Oracle JDBC性能,java,oracle,jdbc,prepared-statement,resultset,Java,Oracle,Jdbc,Prepared Statement,Resultset,到目前为止,我一直在使用类似这样的东西来查询我的数据库,它工作得非常好: PreparedStatement prepStmt = dbCon.prepareStatement(mySql); ResultSet rs = prepStmt.executeQuery(); 但是接下来我需要使用rs.first()以便能够在myrs上迭代多次。所以我现在用 PreparedStatement prepStmt = dbCon.prepareStatement(mySql,ResultSet.TY

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

PreparedStatement prepStmt = dbCon.prepareStatement(mySql);
ResultSet rs = prepStmt.executeQuery();
但是接下来我需要使用
rs.first()
以便能够在my
rs
上迭代多次。所以我现在用

PreparedStatement prepStmt = dbCon.prepareStatement(mySql,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);    
我的问题是关于两人的表现。如果我使用第二个选项,我会损失什么?使用第二个选项会对我目前编写的代码产生任何负面影响吗

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

谢谢大家的关注

更新


我的最大reslutset大小将小于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)将失败。不要为文件指定可滚动性 大型结果集


来源:

为什么从ResultSet构建一个
列表
,然后在任何地方使用该POJO都不是一个选项?相对而言,处理
列表总是比较容易。我的意思是数据类型的东西,传递列数或名称,在那里不适用。是的,这就是我在问这个问题时的想法。如果我有一个性能问题,我一定会使用这个approach@AdeelAnsari,这可能不是resultset相当大的选项。@MaVRoSCy-每列有多大?如果您认为每行是500字节(这显然取决于数据类型),那么每用户1000行就是500 kb。如果您同时拥有1000个用户,那么只有500 MB的存储空间,这可能并不令人望而却步。另一方面,如果你同时拥有100万用户,那就是500 GB,这可能更令人担忧。如果你的行是5000字节而不是500字节,那么你说的是5GB的RAM,这可能是有意义的。谢谢@Justin Cave你真的是一个非常有用的人,Thanks@MaVRoSCy-这取决于你的需要。如果
ResultSet
很小,并且应用程序服务器上有大量RAM,那么使用可滚动的结果集可能是完全合理的。如果没有,您可能需要考虑其他选项。某些系统可能能够关闭并重新打开
ResultSet
,这将迫使Oracle重新执行查询,如果在执行第一次查询后提交了更改,则可能会给出不同的结果。一些系统可能能够在本地集合中缓存数据的子集(即列的子集)。