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)
它SessionFactory是线程安全的,并且在应用程序引导期间只初始化一次.因为你使用的SessionFactory是Spring,所以代表了LocalSessionFactoryBean.
你关心的是正确的Seesion返回由sessionFactory.getCurrentSession()哪个绑定到当前的Thread by HibernateTransactionManager.