ResultSet的Oracle JDBC性能

MaV*_*SCy 6 java oracle jdbc resultset prepared-statement

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

PreparedStatement prepStmt = dbCon.prepareStatement(mySql);
ResultSet rs = prepStmt.executeQuery();
Run Code Online (Sandbox Code Playgroud)

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

PreparedStatement prepStmt = dbCon.prepareStatement(mySql,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);    
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢大家的关注.

UPDATE

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

Mil*_*kic 9

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

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

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


Jus*_*ave 4

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

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