8

私は自分のアプリケーションでSpring/Hibernateのミックスを使用しています(オリジナルはありません)。特定の機能について、CSVファイルのコンテンツをOracleDBのテーブルにインポートする必要があります。今のところ、私はオブジェクトを作成するだけです。

   HibernateTemplate.saveOrUpdate

それらのそれぞれに(新しく割り当てられたIDを取得する必要があります)

次に、SpringトランザクションAPIを使用して、メソッドの最後でトランザクションが発生します。

パフォーマンスを除いて、すべてが正常に機能します。パフォーマンスは、5000のオブジェクトには適切ですが、100000には適切ではありません...

だから私はこのようなものを加速するためのアイデアを探しています。Hibernateでの一括挿入について聞いたことがありますが、確実な参照は見つかりませんでした。このインポートをより優れたパフォーマンスで実行するためのアイデアを誰かに教えてもらえますか?

4

4 に答える 4

7

あなたが試みるかもしれない簡単なことは、100個のオブジェクトごとにセッションをフラッシュしてクリアすることです...

実行します

session.flush();
session.clear();

100または1000挿入ごと。

これにより、休止状態のセッションがフラッシュおよびクリアされ、大きくなりすぎるのを防ぎます(おそらく、10万個のオブジェクトに非常に時間がかかる理由です)。

さらに、ID識別子ジェネレーターを使用している場合、Hibernateはバッチ挿入をサイレントにオフにします。バッチ挿入によりパフォーマンスが向上します。また、一度に100に相当するhibernate.jdbc.batch_size構成プロパティを指定する必要があります。

ManningのHibernateを使用したJavaPersistenceがこれの原因でした(すばらしい本-私の肌を何度も救いました)。

于 2009-08-03T14:45:58.713 に答える
6

一括操作用に設計されているため、StatelessSessionの使用を検討することもできます。

StatelessSession ss=sessionFactory().openStatelessSession();
Transaction tx=ss.beginTransaction();
于 2009-08-03T13:50:00.023 に答える
3

ORMapperが釘に適したハンマーではない場合があります。特にバッチ操作は、多くの場合、単純な古いJDBCを使用してよりパフォーマンスが高く実行されます。もちろん、これはさまざまな条件によって異なりますが、少なくともこれをオプションと見なし、両方のアプローチのパフォーマンスを比較する必要があります。

于 2009-08-04T18:20:15.243 に答える
0

これは、純粋にデータベース挿入のパフォーマンスの問題ではありません。何万ものオブジェクトを作成していてフラッシュを実行していない場合、メモリが不足するまでHibernateセッションは大きくなります。

于 2010-02-09T18:14:37.700 に答える