1

我目前正在重新学习 Hibernate,我已经有五六年没用过了,我正在努力回想我们过去在旧工作场所使用它的方式(Hibernate in Action 已经上线。 ..)

我目前没有在我的应用程序中使用 spring,我想知道的一件事是如何最好地在我的应用程序中检索 SessionFactory 以在我的持久性助手之间共享它 - 我似乎记得你通常只想使用一个. 在我当前的代码库中,我选择在我所有持久性“帮助者”共有的类中这样做:

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

当从多个线程访问您的代码时,您遇到麻烦的可能性很小。当两个线程访问时,getSessionFactory()一个线程可能会创建一个SessionFactory,而另一个线程可能会if(sessionFactory == null)在第一个线程分配给变量之前到达。

解决此问题的最简单方法是制作getSessionFactory() synchronized. 这可能会导致一些锁定开销并对性能产生影响。

有关更复杂的方法,请参见例如此处或在“Singleton pattern java”上进行一些谷歌搜索。

于 2013-09-12T06:12:03.670 回答