1

私はプロジェクトでHibernateを使用しており、順調に進んでいますが、問題は、Hibernate関数を作成するための良い方法を使用しているということです。以下にコードのブロックを貼り付けて、Hibernate関数をどのように記述したかを理解します。それを確認して、それが正しいメソッドであるかどうかを教えてください。これが私のブロックコードの構造です

SessionFactory sessionFactory = 
                (SessionFactory) ServletActionContext.getServletContext().getAttribute(HibernateListener.KEY_NAME);
        Session hibernatesession = sessionFactory.openSession();
        try {
            hibernatesession.beginTransaction();
            // my database access will be here
            hibernatesession.getTransaction().commit();
            hibernatesession.flush();
            }
        catch(Exception e){
          hibernatesession.getTransaction().rollback();
          e.printStackTrace();
        }finally{
          hibernatesession.close();
        }

これは、すべてのdaoクラス関数用に作成した構造ですが、現在、私のWebサイトの読み込みが非常に遅くなっています。だから私の質問は、私が使用した狭窄が正しいものであるということです。上記のコードにより、一度に複数のセッションが休止状態になりますか?

4

2 に答える 2

1

flush()commit()ダメです。

本当に新しいセッションを開いてから、操作ごとに閉じる必要がありますか?

sessionFactory.getCurrentSession()とを使用できますHibernatesession.disconnect()

于 2012-06-30T20:36:45.643 に答える
1

DAOクラスでトランザクション管理を行うのは適切な設計ではありません。Springとその宣言型トランザクション管理を使用することを強くお勧めします。これは、セットアップが簡単で、簡単に使用できます。それがあなたに利用できないならば、あなたは少なくとも貧しい人の代わりをするべきです。1つの提案は、各DAOを、ボイラープレート部分(セッションのオープン/クローズ、トランザクションの開始/コミット)を実行し、オーバーライド可能なメソッドを呼び出して実際の作業を実行するメソッドを持つクラスのサブクラスにすることです。これにより、シナリオのテンプレートパターンが実装されます。これは概要です:

public abstract class DaoTemplate
{
  public void execute() {
    final Session s = ((SessionFactory) ServletActionContext.getServletContext()
        .getAttribute(HibernateListener.KEY_NAME)).openSession();
    try {
      s.beginTransaction();
      doTheRealStuff();
      s.getTransaction().commit();
    }
    catch(Exception e) {
      s.getTransaction().rollback();
      e.printStackTrace();
    } finally { s.close(); }
  }

  protected abstract void doTheRealStuff();
}

もう1つの提案、および10年前のプロジェクトで実際に使用したものは、戦略パターンを実装することです。その場合execute、メソッドを実装するオブジェクトをに渡しますdoTheRealStuff。また、その場合、DaoTemplateクラスはシングルトンである可能性があります(その場合、クラスの別の名前が適切です)。

于 2012-06-30T20:48:43.293 に答える