3

大量のデータ (10,000,000 行を含むテーブルから最大 100,000 行) を抽出することを目的とするアプリケーションを担当しました。残念ながら、抽出は Java + Hibernate で記述されており、パフォーマンスは比較的劣っています。Java + Hibernate を使用した 100,000 行の抽出には、約 1 分 30 秒かかります。Talendを使用した同じ抽出には、約 30 秒かかります (3 分の 1)。

コードの例を次に示します。

Launcher.initStatelessSession();
Launcher.beginStatelessTransaction();

//Creation of the Criteria crit, no join, only a single table is read.
int fetchSize = 1000;
crit.setFetchSize(fetchSize);
crit.setCacheable(false);
crit.setReadOnly(true);

ScrollableResults result = crit.scroll(ScrollMode.FORWARD_ONLY);
// Most of the time is spent from HERE ...
while (result.next()) {
   // Some code but insignificant time compared to the result.next().
   // I replaced this code with continue; and the speed did not really change.
}
// ... to HERE

このクエリを高速化できる最適化に関するアイデアはありますか? 現時点では、Hibernate を別の目的で放棄する予定はありません。

4

1 に答える 1

0

I don't know what talend is, but I suspect it to be some kind of database gui tool?

In this case what possibly might be the reason is that hibernate as to dehydrate the objects, i.e. checking that the retrieved object isn't yet in the session, create an instance and fill all properties (possibly with other referenced entities).

Use a profiler to find out what it is actually going on in greater detail

all this assumes that you actually executing the same sql statement. As mentioned in the comments, depending on your criteria and your mapping hibernate might create very 'interesting' select statements.

于 2012-05-09T11:55:30.637 に答える