私は休止状態+プレイを使用しています!フレームワークが機能している場合、Hibernateを使用して大量のレコードを挿入するための「ベストプラクティス」はありますか?それらはテキストファイルあたり約6,000から10,000であるため、Hibernateがジョブを窒息させるのか、例外をスローするのかはわかりません。
どんな提案でも私に知らせてください、私がもっと説明する必要があるかどうか私に知らせてください
私は休止状態+プレイを使用しています!フレームワークが機能している場合、Hibernateを使用して大量のレコードを挿入するための「ベストプラクティス」はありますか?それらはテキストファイルあたり約6,000から10,000であるため、Hibernateがジョブを窒息させるのか、例外をスローするのかはわかりません。
どんな提案でも私に知らせてください、私がもっと説明する必要があるかどうか私に知らせてください
* Java Persistence and Hibernate "(Manning)から、Pangeaからのコメントに従って、ステートレスセッション(永続コンテキストキャッシュを持たない)を使用します。
StatelessSession session = sessionFactory.openStatelessSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
Item item = new Item(...);
session.insert(item);
}
tx.commit();
session.close();
Kartochの回答のコードのほんの一部の修正。
バッチ処理によると、「StatelessSessionインターフェイスによって定義されたinsert()、update()、およびdelete()操作は、データベースの行レベルの直接操作と見なされます。これらの操作により、それぞれSQL INSERT、UPDATE、またはDELETEが即座に実行されます。 。これらは、Sessionインターフェースによって定義されたsave()、saveOrUpdate()、およびdelete()操作とは異なるセマンティクスを持っています。」
StatelessSessionのsave()、flush()、clear()はもう必要ありません。コードは次のようになります。
StatelessSession session = sessionFactory.openStatelessSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
Item item = new Item(.....);
session.insert(item );
}
tx.commit();
session.close();
最後に、通常のバッチ挿入とStatelessSession挿入の違いについて説明します。バッチ処理にStatelessSessionを使用します。
StatelessSessionsを使用するのが最善です。( http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/batch.html)の次の例を検討してください。
StatelessSession session = sessionFactory.openStatelessSession();
Transaction tx = session.beginTransaction();
ScrollableResults customers = session.getNamedQuery("GetCustomers")
.scroll(ScrollMode.FORWARD_ONLY);
while ( customers.next() ) {
Customer customer = (Customer) customers.get(0);
customer.updateStuff(...);
session.update(customer);
}
tx.commit();
session.close();
セッションとトランザクションを開くだけです。
セッションの保存にすべての要素を追加します。
次に、トランザクションをコミットします。
//Remember to effective handler errors
public void saveAll(List<Object> list) throws Exception{
Session s = HibernateUtil.openSession();
Transaction tx = s.beginTransaction();
for(Object obj : list)
s.save(obj);
tx.commit();
s.flush();
s.close();
}
Hibernateの外部で挿入を実行する場合は、いつでもConnectionオブジェクトを直接取得できます。
Connection connection = DB.getConnection();