2009-08-03 18 views
8

私のアプリケーションでは、Spring/Hibernate(元は何もありません)を使用しています。特定の機能については、CSVファイルの内容を自分のOracle DBの表にインポートする必要があります。 今のところ、私は(私は彼らの新たに割り当てられたIDを取得する必要がある)、それらのそれぞれのSpring/Hibernateを使用したバルク挿入

HibernateTemplate.saveOrUpdate 

を行い、オブジェクトを作成ジュスト

その後、トランザクションが使用して、メソッドの最後に起こりますSpringトランザクションAPI。

すべてはだから私はこのようなものを加速するアイデアを探していくつかの5000のオブジェクトのためではなく100 000 ...

の正しいである、パフォーマンスを除いて、正常に動作します。私はHibernateの一括挿入について聞いたことがありますが、固い参照は見つかりませんでした。誰も私に、より良いパフォーマンスでこのインポートを実行するためのアイデアを教えてもらえますか?

+1

ここではジャークを意味するわけではありませんが、このドキュメントはかなり簡潔で、読んで5分しかかかりません:http://docs.jboss.org/hibernate/stable/core/reference/en/html /batch.html – Tim

+0

リンクをご利用いただきありがとうございます。これはまさに私が探していたものです。私は以前にいくつかの研究をしていましたが、それを見つけられませんでしたが、私はHibernateのドキュメントを掘り下げることについての初心者です。 –

答えて

7

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

ので

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

ごとに100または1000の挿入を実行します。

これは、休止状態のセッションをフラッシュして消去し、それが大きくなりすぎないようにします(おそらく100000個のオブジェクトが長時間かかる理由)。

ID識別ジェネレータを使用している場合、hibernateは静かにバッチインサートをオフにします。バッチインサートはパフォーマンスを向上させます。また、hibernate.jdbc.batch_size構成プロパティーを100に等しい時間数で指定する必要があります。

ManningのJava Persistence with Hibernateがこのソースです(素晴らしい本 - 何度も私の肌を救った)。

6

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

StatelessSession ss=sessionFactory().openStatelessSession(); 
Transaction tx=ss.beginTransaction(); 
+1

リンクが間違っています:https://www.hibernate.org/hib%5Fdocs/v3/api/org/hibernate/StatelessSession.html –

+0

今、両方のリンクが間違っています。ここに新しいリンクがあります:http://docs.jboss.org/hibernate/orm/3.3/api/org/hibernate/StatelessSession.html – Isaac

3

ORMapperが爪の正しいハンマーでないことがあります。特に、バッチ処理は、通常、古いJDBCを使用してより効率よく実行されます。これはもちろん、さまざまな条件に依存しますが、少なくともこれをオプションとして見て、両方のアプローチのパフォーマンスを比較する必要があります。

0

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

関連する問題