在我的java代码中,我使用select语句访问oracle数据库表。我收到很多行(大约50.000行),所以rs.next()需要一些时间来处理所有行。
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
}发布于 2011-10-06 18:08:43
是什么让您认为每次调用rs.next()时ResultSet都会检索数据?它是如何工作的,这取决于实现-如果它一次获取一个块,我不会感到惊讶;很可能是一个相当大的块。
我怀疑您基本上看到了将所有数据复制到CachedRowSet中然后访问所有数据所需的时间-基本上您已经获得了一个没有任何目的的额外复制操作。
发布于 2011-10-06 18:07:08
CachedRowSet将结果缓存到内存中,也就是说,您不再需要连接。因此,它首先是“慢”的。
CachedRowSet对象是在内存中缓存数据行的数据行的容器,这使得在不总是连接到其数据源的情况下进行操作成为可能。
-> http://download.oracle.com/javase/1,5.0/docs/api/javax/sql/rowset/CachedRowSet.html
发布于 2012-08-04 02:08:51
将CachedRowSet与postgres jdbc驱动程序结合使用时会出现问题。
CachedRowSet需要知道列的类型,这样它才能知道要创建哪些java对象(天知道它在幕后从DB获取了什么!)。
因此,它往返于DB以获取列元数据。在数量非常大的情况下,这会成为一个真正的问题。如果数据库在远程服务器上,这也是一个真正的问题,因为网络延迟。
我们已经使用CachedRowSet很多年了,然后才发现这一点。我们现在实现了我们自己的CachedRowSet,因为我们从来没有使用过任何花哨的东西。我们对所有类型执行getString,并将自己转换为最快的方式。
这显然不是fetch大小的问题,因为postgres驱动默认情况下会获取所有内容。
https://stackoverflow.com/questions/7672800
复制相似问题