1

私は現在、5、6 年ほど使用していなかった Hibernate を再学習しており、以前の職場で使用していた方法を思い出そうとしています (Hibernate in Action は注文中です。 ..)

現在、アプリケーションでSpringを使用していません.1つ疑問に思っているのは、アプリケーションでSessionFactoryを取得して永続化ヘルパー間で共有する方法です-通常、1つだけを使用したいことを思い出したようです. 私の現在のコードベースでは、すべての永続的な「ヘルパー」に共通のクラスで、次のようにすることを選択しています。

public abstract class AbstractHelper {

  private static final String CONFIG = "configuration.xml";
  private static SessionFactory sessionFactory = null;

  /**
   * @return SessionFactory the Hibernate SessionFactory.
   */
  public static SessionFactory getSessionFactory() {
    if (sessionFactory == null) {
      Configuration configuration = new Configuration();
      configuration.configure(CONFIG);
      ServiceRegistryBuilder serviceRegistryBuilder = 
            new ServiceRegistryBuilder().applySettings(configuration.getProperties());
      sessionFactory = configuration.buildSessionFactory(
            serviceRegistryBuilder.buildServiceRegistry());
    }

    return sessionFactory;
  }

}

これは人々にとっても理にかなっていますか、それともパフォーマンスなどの理由で別の方法でこれを行う必要がありますか?

4

1 に答える 1

2

コードが複数のスレッドからアクセスされると、問題が発生する可能性がわずかにあります。2 つのスレッドがアクセスすると、getSessionFactory()一方が を作成し、もう一方が、最初のスレッドが変数に割り当てられる前にSessionFactory到達する可能性があります。if(sessionFactory == null)

これを修正する最も簡単な方法は、getSessionFactory() synchronized. これにより、ロックのオーバーヘッドが発生し、パフォーマンスに影響を与える可能性があります。

より洗練された方法については、たとえばここを参照するか、「Singleton pattern java」でグーグル検索を行ってください。

于 2013-09-12T06:12:03.670 に答える