结果集的Oracle JDBC性能(Oracle JDBC performance of Resul

2019-09-24 02:45发布

我用的是到目前为止是这样的查询我的数据库是工作完美的罚款:

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

Answer 1:

由于Oracle游标是只进结构,以模拟滚动游标,JDBC驱动程序一般会需要在内存中缓存的结果,如果它希望能够确保当你通过迭代,同样的结果返回结果的第二时间。 根据从查询返回的结果的数量和大小,可以涉及到应用程序服务器上所消耗的额外内存大量。 在另一方面,这应该意味着通过遍历ResultSet第二时间应比第一次更加高效。

是否需要额外的内存是有意义取决于你的应用。 你说最大ResultSet将有1000行。 如果您的数字,每行是500个字节(这显然将取决于数据types--如果你ResultSet只是有一串数字,那将是更小的,如果它包含了一堆长描述字符串,它可能是更大),1000行是每个用户500 KB。 如果你有1000个用户同时使用,这是只有500 MB的储存空间,其可能是不禁止的。 如果你有百万用户同时,在另一方面,这是500 GB这可能意味着你买了几个新的服务器。 如果行是5000个字节,而不是500,那么你说的RAM可能是应用程序服务器运行应用程序所需要的内存的大部分约5 GB。



Answer 2:

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

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

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



文章来源: Oracle JDBC performance of ResultSet