1

Hibernate で大きなデータを挿入または更新しようとしています。350k オブジェクトを含むリストがあり、 Hibernate を使用すると、saveOrUpdate()すべてのデータを挿入するのに数時間かかります。

この操作には以下のコードを使用しています。私の開発環境はJDK1.4とOracle Databaseです。

public void saveAll(List list)throws HibernateException{
    Session session = HibernateUtil.getEYSSession();
    Iterator it = list.iterator();
    int i = 0;
    while(it.hasNext()){ 
        i++;
        Object obj = it.next();
        session.saveOrUpdate(obj);
        if (i % 50 == 0) { session.flush(); session.clear(); }
    }
}

私はバッチ更新を使用しており、hibernate.jdbc.batch_sizeプロパティ 50 も設定していますが、役に立ちませんでした。

私のオブジェクトは別のオブジェクトと 1 対 1 の関係にあるため、この場合 StatelessSession を使用すると問題が発生する可能性があります。StatelessSession は構成されたオブジェクトにカスケードしないためだと思います。

saveOrUpdate()この場合、操作のパフォーマンスを向上させる方法について何かアイデアはありますか?

ありがとう。

4

4 に答える 4

0
  Session session = sessionFactory.openStatelessSession();
  Transaction tx = session.beginTransaction();
  int i = 0;
  while(it.hasNext()){ 
    i++;
    Object obj = it.next();
    session.save(obj) 
    if (i % 50 == 0) { session.flush(); session.clear();}

statelessSession は、パフォーマンスの向上に役立ちます。

于 2013-06-13T09:51:48.310 に答える
0

すべてのsaveOrUpdate操作に対して、Hibernate はselectステートメントも生成します。私の意見では、Hibernate の saveOrUpdate を使用して巨大なデータを更新または挿入することは、まったく良い選択肢ではありません。ストアド プロシージャを使用するか、SpringJDBCTemplate に移行することをお勧めします。

于 2013-06-13T09:17:29.153 に答える
0

save()メソッドまたは Hibernateを使用する必要があるインスタンスを分離すると、merge()パフォーマンスがわずかに向上することがわかりました。しかし、100,000 個のオブジェクトを保存して更新したことも覚えており、それにはかなりの時間がかかりました。そのため、ストアド プロシージャがより効率的なメカニズムである可能性があります。

于 2013-06-13T09:21:36.167 に答える
0

futureTask を使用して、データベースの挿入を完了することができます。プログラムを続行します。

これにより時間は短縮されませんが、プログラムは挿入プロセスの完了を待ちません。

于 2013-06-13T09:21:39.207 に答える