没有Spring的SessionFactory的使用?

时间:2013-09-12 01:29:09

标签: java hibernate sessionfactory

我目前正在重新学习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;
  }

}

这对人们来说是否有意义,或者我是否应该出于性能等原因以不同方式解决这个问题?

1 个答案:

答案 0 :(得分:2)

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

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

对于更复杂的方法,请参阅示例here或在“Singleton模式java”上进行一些Google搜索。