我用的是到目前为止是这样的查询我的数据库是工作完美的罚款:
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
我最大reslutset规模将小于1000点的行和列15-20
由于Oracle游标是只进结构,以模拟滚动游标,JDBC驱动程序一般会需要在内存中缓存的结果,如果它希望能够确保当你通过迭代,同样的结果返回结果的第二时间。 根据从查询返回的结果的数量和大小,可以涉及到应用程序服务器上所消耗的额外内存大量。 在另一方面,这应该意味着通过遍历ResultSet
第二时间应比第一次更加高效。
是否需要额外的内存是有意义取决于你的应用。 你说最大ResultSet
将有1000行。 如果您的数字,每行是500个字节(这显然将取决于数据types--如果你ResultSet
只是有一串数字,那将是更小的,如果它包含了一堆长描述字符串,它可能是更大),1000行是每个用户500 KB。 如果你有1000个用户同时使用,这是只有500 MB的储存空间,其可能是不禁止的。 如果你有百万用户同时,在另一方面,这是500 GB这可能意味着你买了几个新的服务器。 如果行是5000个字节,而不是500,那么你说的RAM可能是应用程序服务器运行应用程序所需要的内存的大部分约5 GB。
如果您使用可滚动(你的第二个选项),要注意这一点:
重要提示:由于任何可滚动的结果集的所有行都存储在客户端缓存,其中结果集包含许多行,许多列,或者非常大的列的情况下可能会导致客户端的Java虚拟机(JVM)失败。 不要为一个大的结果集指定滚动性。
来源: Oracle数据库JDBC开发人员指南和参考