Hibernate和Thread Safety:注入的SessionFactory线程是否安全?

use*_*059 3 java spring multithreading hibernate

所以,我正在使用Spring的Hibernate DAO.我的DAO将由ApplicationContextIOC容器构建,并且SessionFactory将由容器(LocalSessionFactoryBean)注入.

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

我对线程安全的理解是所有状态字段都需要在多线程环境中保护.现在,使用这个类将是Spring将设置SessionFactorybean创建,之后该工厂将不会被更改.这意味着它可以在多线程环境中安全地运行,但我觉得这是一种非常冒险的做法,只是假设不会再次调用setter方法.

问题是,同步SessionFactory所需的所有调用也需要同步.因此我在下面输入的insertPortfolio()方法也需要同步,这会使得拥有与数据库的可用连接池的目的失败,因为访问将一次限制为一个线程.

我想我能想到的最好的解决方案是将它从setter注入更改为构造函数注入,并使该SessionFactory字段最终.但是我试图了解这里涉及的更广泛的问题,所以我可以在未来的春天做出很好的多线程安全决策.

private SessionFactory sessionFactory;

public HibernatePortfolioDao() {}

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

@Override
public void insertPortfolio(PortfolioModel portfolioModel) {
    sessionFactory.getCurrentSession().save(portfolioModel);
}
Run Code Online (Sandbox Code Playgroud)

Vla*_*cea 6

SessionFactory是线程安全的,并且在应用程序引导期间只初始化一次.因为你使用的SessionFactory是Spring,所以代表了LocalSessionFactoryBean.

你关心的是正确的Seesion返回由sessionFactory.getCurrentSession()哪个绑定到当前的Thread by HibernateTransactionManager.