6

到目前为止,我一直在使用这样的东西来查询运行良好的数据库:

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 上)。

谢谢大家的关注。

更新

我的最大 reslutset 大小将小于 1000 行和 15-20 列

4

2 回答 2

9

如果您使用可滚动性(您的第二个选项),请注意这一点:

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

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

于 2012-10-15T06:38:30.637 回答
4

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

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

于 2012-10-15T06:34:01.990 回答