【问题标题】:Use of SessionFactory without Spring?在没有 Spring 的情况下使用 SessionFactory?
【发布时间】:2013-09-16 05:29:14
【问题描述】:

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

}

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

【问题讨论】:

  • 对我来说这似乎很好(因为这是我们过去常常这样做的方式)。我唯一建议的是关心线程。我会让正在构建 SessionFactory 的块同步。
  • 确切地说是整个if 块(包括空检查)。

标签: java hibernate sessionfactory


【解决方案1】:

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

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

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

【讨论】:

  • 好的,谢谢。正如@Ean 之前建议的那样,我已经同步了代码 - 不是在方法上,而是在 null 检查内的代码上的同步块中使用该类作为锁。
  • null-check 也必须同步 - 否则上述情况下的第二个线程在被锁停止之前已经进入 if 块。试图避免这种情况会导致像 DoubleCheckLocking 这样的东西,它也有几个奇怪的困难......
猜你喜欢
  • 2020-04-24
  • 2023-03-10
  • 2020-12-23
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-05
  • 2015-06-16
相关资源
最近更新 更多