以下是我的Bean配置
@Bean
public SessionFactory getSessionFactoryBean(@Autowired(required = true) HikariDataSource dataSource) {
LocalSessionFactoryBean sessionFacBean = new LocalSessionFactoryBean();
sessionFacBean.setDataSource(dataSource);
sessionFacBean.setPackagesToScan("com.project");
Properties hibernateProperties = new Properties();
hibernateProperties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
sessionFacBean.setHibernateProperties(hibernateProperties);
try {
sessionFacBean.afterPropertiesSet();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return sessionFacBean.getObject();
}
我在我的控制器类中使用了这个'SessionFactory'Bean。据我所知,spring在多个请求期间使用控制器类的新实例创建一个新线程。在这种情况下,“SessionFactory”bean的新实例也将自动连接到控制器(Explained in this link)。这个sessionFactory的重点是ConnectionPooling,如果为每个请求创建了sessionFactory,那么连接池如何正常工作。
我对其他bean也有类似的情况,HttpClient和带有连接池的MongoTemplate。
如果我的理解是错误的,请随时编辑问题。我是这一切的新手。
答案 0 :(得分:0)
SessionFactory
。它应该在应用程序启动期间配置。Session
。如何将Session
与请求一起使用有多种方法:
https://stackoverflow.com/a/37526397/3405171 在这种情况下,一个新的' SessionFactory' bean也将自动连接到控制器
这是不正确的。 @Bean
注释默认为singleton
范围。因此,对于所有线程和控制器,您只有一个SessionFactory
。
此sessionFactory的重点是ConnectionPooling
要说得更准确,DataSource
负责连接池。 SessionFactory
用于Hibernate特定的东西,如持久化类元数据,SQL生成等。
还要记住,Hibernate有org.hibernate.context.spi.CurrentSessionContext
来控制Session
与线程的关系。