因此,我在 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,所以 SessionFactory
由 LocalSessionFactoryBean
表示.
您真正关心的是 sessionFactory.getCurrentSession()
返回的 Seesion
,它通过 HibernateTransactionManager
绑定(bind)到当前线程.
关于java - hibernate 和线程安全 : Is an injected SessionFactory thread safe?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32926548/