如何在我的Spring启动应用程序的以下场景中管理Hibernate SessionFactory Bean?

时间:2017-11-26 16:27:32

标签: spring hibernate spring-boot connection-pooling sessionfactory

以下是我的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。

如果我的理解是错误的,请随时编辑问题。我是这一切的新手。

1 个答案:

答案 0 :(得分:0)

  1. 您的应用程序应该只有一个SessionFactory。它应该在应用程序启动期间配置。
  2. 每个帖子都应该有自己的Session。如何将Session与请求一起使用有多种方法: https://stackoverflow.com/a/37526397/3405171
  3.   

    在这种情况下,一个新的' SessionFactory' bean也将自动连接到控制器

    这是不正确的。 @Bean注释默认为singleton范围。因此,对于所有线程和控制器,您只有一个SessionFactory

      

    此sessionFactory的重点是ConnectionPooling

    要说得更准确,DataSource负责连接池。 SessionFactory用于Hibernate特定的东西,如持久化类元数据,SQL生成等。

    还要记住,Hibernate有org.hibernate.context.spi.CurrentSessionContext来控制Session与线程的关系。