3

私の 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が通常の よりも遅い理由がわかりません。ResultSetCachedRowSetResultSetrs.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

4 に答える 4

4

CachedRowSetpostgresjdbcドライバーと一緒に結合すると問題が発生します。

CachedRowSet作成するJavaオブジェクトを知るために、列のタイプを知る必要があります(神は、DBから他に何をフェッチするかを知っています!)。

そのため、列メタデータをフェッチするためにDBへのラウンドトリップが増えます。非常に大量の場合、これは実際の問題になります。DBがリモートサーバー上にある場合、ネットワークの遅延のため、これも実際の問題です。

私たちはCachedRowSet何年も使用していて、これを発見したばかりです。CachedRowSetとにかく派手なものを使用したことがないので、今は独自のを実装しています。getStringこれが最も速い方法のように思われるので、私たちはすべてのタイプに対して行い、自分自身を変換します。

postgresドライバーはデフォルトですべてをフェッチするため、これは明らかにフェッチサイズの問題ではありませんでした。

于 2012-08-03T18:08:51.470 に答える
4

CachedRowSet は結果をメモリにキャッシュします。つまり、接続はもう必要ありません。したがって、そもそも「遅い」のです。

CachedRowSet オブジェクトは、行をメモリにキャッシュするデータ行のコンテナーです。これにより、常にデータ ソースに接続しなくても操作できます。

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

于 2011-10-06T10:07:08.440 に答える
3

が呼び出されるResultSetたびにデータを取得すると思う理由は何ですか? rs.next()それがどのように機能するかは実装次第です。一度にチャンクをフェッチしても驚かないでしょう。おそらくかなり大きな塊です。

CachedRowSet基本的に、すべてのデータをにコピーしてからすべてアクセスするのにかかる時間を確認していると思われます。基本的に、目的のない余分なコピー操作が必要です。

于 2011-10-06T10:08:42.597 に答える
0

通常の ResultSet を使用すると、RowPrefetch と FetchSize でより多くの最適化オプションを取得できます。

これらはネットワーク トランスポート チャンクと while ループでの処理を最適化するため、rs.next() には常に処理するデータがあります。

FetchSize のデフォルトは 10 (Oracle の最新バージョン) に設定されていますが、私が知っているように、RowPrefetch は設定されていません。したがって、ネットワーク転送がまったく最適化されていないことを意味します。

于 2016-08-11T11:49:02.067 に答える