【问题标题】:CachedRowSet slower than ResultSet?CachedRowSet 比 ResultSet 慢?
【发布时间】:2011-10-06 10:04:32
【问题描述】:

在我的 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
}

【问题讨论】:

标签: java oracle cachedrowset


【解决方案1】:

CachedRowSet 将结果缓存在内存中,即您不再需要连接。因此它首先“慢”。

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

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

【讨论】:

    【解决方案2】:

    CachedRowSet 与 postgres jdbc 驱动程序结合使用存在问题。

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        这些优化了网络传输块和 while 循环中的处理,因此 rs.next() 始终有数据可以使用。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-10
          • 2013-10-15
          相关资源
          最近更新 更多