使用SpringBoot和Hibernate处理并发请求

时间:2017-06-17 17:13:41

标签: java spring hibernate spring-boot

我正在使用SpringBoot创建一个Web应用程序。在我的应用程序中,我有RestController层,它将调用Service Layer,而Service Layer又将调用DAO层。 我的服务层使用@Transactional(Spring事务)

进行注释

我使用Generic DAO Hibernate实现了DAO层

    public class Dao{

        @Autowired(name = "sessionFactory")
        private SessionFactory sessionFactory;

        public <T> T save(final T o){
          return (T) sessionFactory.getCurrentSession().save(o);
        }


        public void delete(final Object object){
          sessionFactory.getCurrentSession().delete(object);
        }

        /***/
        public <T> T get(final Class<T> type, final Long id){
          return (T) sessionFactory.getCurrentSession().get(type, id);
        }

        /***/
        public <T> T merge(final T o)   {
          return (T) sessionFactory.getCurrentSession().merge(o);
        }

        /***/
        public <T> void saveOrUpdate(final T o){
          sessionFactory.getCurrentSession().saveOrUpdate(o);
        }
    }

在application.properties中,我有 spring.jpa.properties.hibernate.current_session_context_class = org.springframework.orm.hibernate4.SpringSessionContext

所以我担心的是多个并发请求何时进入我的REST控制器 我是否需要将服务层bean / DAO图层bean的范围保留为原型? 另外,我是否需要同步DAO层中的方法?或者getCurrentSession()将始终返回新会话,因为hibernate会话不是线程安全的。

P.S由于某些特定原因,我不想使用Spring Data JPA

1 个答案:

答案 0 :(得分:0)

  

所以我担心的是多个并发请求何时进入我的REST   Controller我是否需要保留服务层bean / DAO层的范围   豆子作为原型?

  • 相反,您需要将bean保留为Singleton。
  

另外,我是否需要同步DAO层中的方法?要么   getCurrentSession()将始终返回自hibernate以来的新会话   session不是线程安全的。

您将会话作为Spring Bean,默认情况下是Singleton,因此所有请求只有一个实例。

您是否考虑过使用spring-rest-data项目?