java - hibernate 和线程安全 : Is an injected SessionFactory thread safe?

标签 java multithreading spring hibernate

因此,我在 Spring 中使用 Hibernate DAO。我的 DAO 将由 ApplicationContext IOC 容器构建,SessionFactory 将由容器 (LocalSessionFactoryBean) 注入(inject)。

现在,这个 DAO 将成为一个单例,用于我程序中的所有 CRUD 操作,它后面有一个数据库连接池。我担心的是 sessionFactory 字段的线程安全。

我对线程安全的理解是,在多线程环境下,所有的状态域都需要被守护。现在,这个类的用途是 Spring 将在创建 bean 时设置 SessionFactory,此后该工厂将不会更改。这意味着从技术上讲,它可以在多线程环境中安全地运行,但我认为这是一种非常冒险的做法,只是在假设不会再次调用 setter 方法的情况下进行操作。

问题是,同步 SessionFactory 需要同步所有对它的调用。因此,我在下面放入的 insertPortfolio() 方法也需要同步,这违背了拥有一个数据库可用连接池的目的,因为一次只能访问一个线程。

我想我能想到的最佳解决方案是将其从 setter 注入(inject)更改为构造函数注入(inject),并使 SessionFactory 字段成为最终字段。但我正试图了解这里涉及的更广泛的问题,因此我可以在未来使用 spring 做出良好的多线程安全决策。

private SessionFactory sessionFactory;

public HibernatePortfolioDao() {}

public void setSessionFactory(SessionFactory sessionFactory){
    this.sessionFactory = sessionFactory;
}

@Override
public void insertPortfolio(PortfolioModel portfolioModel) {
    sessionFactory.getCurrentSession().save(portfolioModel);
}

最佳答案

SessionFactory 是线程安全的,它在应用程序引导期间只初始化一次。因为您使用的是 Spring,所以 SessionFactoryLocalSessionFactoryBean 表示.

您真正关心的是 sessionFactory.getCurrentSession() 返回的 Seesion,它通过 HibernateTransactionManager 绑定(bind)到当前线程.

关于java - hibernate 和线程安全 : Is an injected SessionFactory thread safe?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32926548/

相关文章:

c# - 我可以在 C# 中使用无类型集合吗

ios - Unity3D WWW 在 iOS 的主线程上调用

java - 无法在 Spring Boot 中获取属性

java - 当 @Scheduled 触发时,在 SecurityContext 中未找到 Authentication 对象?

java - 如何解码来自 TCP 套接字的数据

java - 播放音乐的服务+ Activity

java - 无法执行语句更新

java - 多线程 spark sql 作业总是失败

java - 为什么 TimerTask 不能重用到另一个计时器中,但已经使用的 TimerTask 可以重用到 ScheduledExecutorService 中

java - 如何使用 gradle 从 Spring Boot 应用程序生成 jar 文件?