首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CachedRowSet比ResultSet慢吗?

CachedRowSet比ResultSet慢吗?
EN

Stack Overflow用户
提问于 2011-10-06 18:04:32
回答 4查看 7.3K关注 0票数 3

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

代码语言:javascript
复制
using ResultSet, the processing of all rows (rs.next) takes about 30 secs

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

代码语言:javascript
复制
using CachedRowSet, the processing of all rows takes about 35 secs

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

以下是代码的一部分:

代码语言:javascript
复制
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
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-10-06 18:08:43

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

我怀疑您基本上看到了将所有数据复制到CachedRowSet中然后访问所有数据所需的时间-基本上您已经获得了一个没有任何目的的额外复制操作。

票数 3
EN

Stack Overflow用户

发布于 2011-10-06 18:07:08

CachedRowSet将结果缓存到内存中,也就是说,您不再需要连接。因此,它首先是“慢”的。

CachedRowSet对象是在内存中缓存数据行的数据行的容器,这使得在不总是连接到其数据源的情况下进行操作成为可能。

-> http://download.oracle.com/javase/1,5.0/docs/api/javax/sql/rowset/CachedRowSet.html

票数 4
EN

Stack Overflow用户

发布于 2012-08-04 02:08:51

CachedRowSet与postgres jdbc驱动程序结合使用时会出现问题。

CachedRowSet需要知道列的类型,这样它才能知道要创建哪些java对象(天知道它在幕后从DB获取了什么!)。

因此,它往返于DB以获取列元数据。在数量非常大的情况下,这会成为一个真正的问题。如果数据库在远程服务器上,这也是一个真正的问题,因为网络延迟。

我们已经使用CachedRowSet很多年了,然后才发现这一点。我们现在实现了我们自己的CachedRowSet,因为我们从来没有使用过任何花哨的东西。我们对所有类型执行getString,并将自己转换为最快的方式。

这显然不是fetch大小的问题,因为postgres驱动默认情况下会获取所有内容。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7672800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档