12

私は休止状態+プレイを使用しています!フレームワークが機能している場合、Hibernateを使用して大量のレコードを挿入するための「ベストプラクティス」はありますか?それらはテキストファイルあたり約6,000から10,000であるため、Hibernateがジョブを窒息させるのか、例外をスローするのかはわかりません。

どんな提案でも私に知らせてください、私がもっと説明する必要があるかどうか私に知らせてください

4

5 に答える 5

24

* 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();
于 2011-01-03T19:46:17.190 に答える
3

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を使用します

于 2015-01-08T16:03:17.643 に答える
2

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();
于 2013-08-06T03:24:08.030 に答える
1

セッションとトランザクションを開くだけです。

セッションの保存にすべての要素を追加します。

次に、トランザクションをコミットします。

//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();
}
于 2011-01-03T19:35:21.553 に答える
-5

Hibernateの外部で挿入を実行する場合は、いつでもConnectionオブジェクトを直接取得できます。

Connection connection = DB.getConnection();
于 2011-01-03T20:31:05.230 に答える