java CachedRowSet比ResultSet慢?
在java代码中,我使用select语句访问oracle数据库表。
我收到很多行(大约50000行),因此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
}
# 1 楼答案
CachedRowSet将结果缓存在内存中,即不再需要连接。因此,它首先“慢”
->http://download.oracle.com/javase/1,5.0/docs/api/javax/sql/rowset/CachedRowSet.html
# 2 楼答案
是什么让您认为每次调用
ResultSet
时rs.next()
都会检索数据?它的工作方式完全取决于实现——如果它一次获取一个块,我也不会感到惊讶;很可能是相当大的一块我怀疑您基本上看到了将所有数据复制到
CachedRowSet
和然后访问所有数据所需的时间-基本上您得到了一个没有目的的额外复制操作# 3 楼答案
与postgres jdbc驱动程序耦合的
CachedRowSet
存在问题CachedRowSet
需要知道列的类型,以便知道要创建哪些java对象 (天知道它还能从被子后面的DB那里得到什么!)因此,它会向数据库进行更多的往返以获取列元数据。 在数量非常大的情况下,这将成为一个真正的问题。 如果数据库位于远程服务器上,这也是一个真正的问题,因为网络延迟
我们已经使用
CachedRowSet
多年了,刚刚发现了这一点。我们现在实现了我们自己的CachedRowSet
,因为我们从来没有使用过它的任何花哨的东西。 我们对所有类型进行getString
转换,因为这似乎是最快的方法这显然不是获取大小的问题,因为postgres驱动程序默认获取所有内容
# 4 楼答案
使用normal ResultSet,您可以使用RowPrefetch和FetchSize获得更多优化选项
这些优化了while循环中的网络传输块和处理,因此rs.next()始终有一个要处理的数据
FetchSize默认设置为10(Oracle最新版本),但据我所知,RowPrefetch未设置。因此,这意味着网络传输根本没有得到优化