Java 使用无弹簧的SessionFactory?

Java 使用无弹簧的SessionFactory?,java,hibernate,sessionfactory,Java,Hibernate,Sessionfactory,我现在正在重新学习Hibernate,我已经有五六年没有使用它了,我试图回想一下我们在旧的工作场所使用它的方式(Hibernate在运行中是按顺序的…) 目前我的应用程序中没有使用spring,我想知道的一件事是如何在我的应用程序中最好地检索SessionFactory,以便在我的持久性助手中共享它——我似乎记得您通常只想使用一个。在我当前的代码库中,我选择在我所有Perience“助手”都通用的类中这样做: public abstract class AbstractHelper { p

我现在正在重新学习Hibernate,我已经有五六年没有使用它了,我试图回想一下我们在旧的工作场所使用它的方式(Hibernate在运行中是按顺序的…)

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

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;
  }

}

这对人们来说有意义吗?或者出于性能等原因,我应该以不同的方式进行吗?

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

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


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

对我来说,这似乎很好(因为这是我们在旧时代使用的方法)。我唯一建议的是关注线程。我会使正在构建SessionFactory的块同步。确切地说,整个
if
块(包括空检查)。是的,谢谢。正如@Ean之前所建议的,我已经同步了代码-不是在方法上,而是在空检查内的代码的同步块中使用类作为锁。空检查也必须同步-否则上述情况下的第二个线程在被锁停止之前将已经进入if块。试图避免这种情况会导致类似DoubleCheckLocking的情况,这也有一些奇怪的困难。。。。