0

こんにちは私はwhenリクエストが配列に付属しているアプリケーションを持っています私はテーブルからデータを選択する必要があり、見つからない場合は新しい値を生成してテーブルに挿入し、次に再びループ統計をチェックして次の値をチェックします。これは、新しいリクエストに対して約50000回実行されます。

使ってます

  public void save(Object obj,Session session)  {       

        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            session.save(obj);
            //session.saveOrUpdate(obj);
            //session.flush();

            session.clear();
            tx.commit();
        }
        catch (HibernateException e) {
            e.printStackTrace();
            logger.error(e.getMessage(), e);            

            if(tx!=null){
                tx.rollback();
            }
        } 
}

コミットするメソッドであり、生成された新しい値ごとに呼び出されます。リクエストごとに50000回呼び出されます。テーブルに重複する値を生成したくないので、値ごとにトランザクションをコミットする必要があります。したがって、新しいリクエストに同じデータが含まれ、前のリクエストが実行されている場合は、値をテーブルからフェッチする必要があります。したがって、各トランザクションをコミットする必要があると思います。しかし、従来のJDBCを使用し、休止状態にしない場合、これは非常に高速になります。私は何か間違ったことをしていますか?それと比較して休止状態は遅いですか?原因私はほとんどの時間がトランザクションの開始とコミットに何度も費やされていると思います。

4

1 に答える 1

3

あなたがしているのはバッチ処理です。

いくつかのアイデア

  • トランザクションを大きくする (複数の挿入にまたがる)
  • 楽観的ロックを使用します: 競合が発生した場合は再試行します
  • JDBC バッチ サイズを構成する

挿入の重複を避けるには、自然キーを保持し、一意の制約を持つ追加の列を追加します。

于 2012-05-29T07:41:34.587 に答える