2011-10-06 41 views
3

在我的java代码中,我使用select语句访问oracle数据库表。 我收到很多行(约50.000行),所以rs.next()需要一些时间来处理所有行。CachedRowSet比ResultSet慢吗?

using ResultSet, the processing of all rows (rs.next) takes about 30 secs 

我的目标是加快这个过程,所以我改变了代码,现在使用CachedRowSet

using CachedRowSet, the processing of all rows takes about 35 secs 

我不明白为什么CachedRowSet比正常ResultSet慢,因为CachedRowSet一次检索所有数据,而ResultSet每次调用rs.next时检索数据。

下面是代码的一部分:

try { 
    stmt = masterCon.prepareStatement(sql); 
    rs = stmt.executeQuery(); 

    CachedRowSet crset = new CachedRowSetImpl(); 
    crset.populate(rs); 

    while (rs.next()) { 
     int countStar = iterRs.getInt("COUNT"); 
     ... 
    } 
} finally { 
    //cleanup 
} 
+0

即使CachedRowSet同时检索所有数据,也需要时间返回该数据 - 原始SQL查询从Oracle控制台上独立运行多久? –

回答

3

是什么让你认为ResultSet每次都会rs.next()检索数据被称为?这取决于它的工作原理 - 如果它一次获取块,我不会感到惊讶;很可能是一个相当大的块。

我怀疑你基本上看它需要复制所有数据的时间到CachedRowSet然后访问这一切 - 基本上你有没有为目的的额外的复制操作。

3

CachedRowSet与postgres jdbc驱动程序结合在一起时出现问题。

CachedRowSet需要知道列的类型,以便知道要创建哪个java对象 (上帝知道还有什么它从封面后面的数据库中获取!)。

因此,它为数据库提供更多的往返行以获取列元数据。 数量很大时,这成为一个真正的问题。 如果数据库位于远程服务器上,由于网络延迟问题,这也是一个真正的问题。

多年来我们一直在使用CachedRowSet,并刚刚发现了这一点。我们现在执行我们自己的CachedRowSet,因为我们从来没有使用任何它的花哨的东西。 我们为所有类型做getString并转换自己,因为这似乎是最快捷的方式。

由于postgres驱动程序默认获取所有内容,所以这显然不是提取大小的问题。

0

使用普通的ResultSet,您可以通过RowPrefetch和FetchSize获得更多优化选项。

那些在while循环中优化网络传输块和处理,所以rs.next()总是有一个数据来处理。

FetchSize的默认设置为10(Oracle最新版本),但据我所知RowPrefetch没有设置。因此意味着网络传输没有得到优化。