有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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
}

共 (4) 个答案

  1. # 2 楼答案

    是什么让您认为每次调用ResultSetrs.next()都会检索数据?它的工作方式完全取决于实现——如果它一次获取一个块,我也不会感到惊讶;很可能是相当大的一块

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

  2. # 3 楼答案

    与postgres jdbc驱动程序耦合的CachedRowSet存在问题

    CachedRowSet需要知道列的类型,以便知道要创建哪些java对象 (天知道它还能从被子后面的DB那里得到什么!)

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

    我们已经使用CachedRowSet多年了,刚刚发现了这一点。我们现在实现了我们自己的CachedRowSet,因为我们从来没有使用过它的任何花哨的东西。 我们对所有类型进行getString转换,因为这似乎是最快的方法

    这显然不是获取大小的问题,因为postgres驱动程序默认获取所有内容

  3. # 4 楼答案

    使用normal ResultSet,您可以使用RowPrefetch和FetchSize获得更多优化选项

    这些优化了while循环中的网络传输块和处理,因此rs.next()始终有一个要处理的数据

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