0

私はplay1.2.4プロジェクトに取り組んでおり、4つのジョブを間隔を置いて実行し、(Webサービスから)バルクデータをフェッチしてデータベースに保存しています。

私の現在の一括挿入方法は次のようなものです。

      org.hibernate.Session session = 
            (org.hibernate.Session)MyEntityModel.em().getDelegate(); 
  Transaction tx = session.beginTransaction();
  int i = 0;
  for(Sales obj:sales)
      {
            convertToModelAndSave(obj);
          i++;
          if(i%100==0)
          {
              tx.commit();
              session.flush();
              session.clear();
              tx=session.beginTransaction();
          }
      }
  session.disconnect();

私は仕事が終わった後に単にセッションを切断しています。

これで十分かどうか疑問に思っていますが、本当にセッションを切断する必要がありますか(プログラムで例外が発生します)。データベース接続プールは切断後に解放されますか?

4

1 に答える 1

1

これを行う別の方法は、作業を2つのジョブに分割することです。

  • 最初のジョブはメインのジョブであり、データを100アイテムのチャンクに分割します
  • 2つ目は、いくつかのアイテムを取得して保存します

次に、最初のジョブが2番目のジョブを呼び出し、休止状態に関連するコードをコードに含める必要はありません。

もう1つの利点:100個のアイテムを保存しているときにロールバックがある場合、この場合はアイテムを1つずつ保存してメインのジョブを再試行し、1つのエラーで100個のアイテムが失われないようにすることができます。

この場合、複数のサブジョブを並行して起動して、高速化することもできます。

于 2012-07-05T14:42:57.873 に答える