2017-06-17 33 views
0

SpringBootを使用してWebアプリケーションを作成しています。私のアプリケーションでは、DAOレイヤを呼び出すService Layerを呼び出すRestControllerレイヤがあります。私のサービス層は(春トランザクション)SpringBootとHibernateによる同時リクエストの処理

@Transactionalでアノテートされて、私はジェネリックDAO休止状態application.propertiesで

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); 
     } 
    } 

を使用してDAO層を実装した 、私は spring.jpa.properties.hibernate.current_session_context_classを持っています= org.springframework.orm.hibernate4.SpringSessionContext

私の懸念は、複数の同時リクエストが自分のRESTコントローラに来るときです サービスレイヤーBean/DAOレイヤーBeanをプロトタイプとして保持する必要がありますか? また、DAOレイヤーのメソッドを同期させる必要がありますか? hibernateセッションはスレッドセーフではないため、getCurrentSession()は常に新しいセッションを返します。複数の同時要求が私のREST コントローラに来るとき、私は原因

答えて

0

いくつかの具体的な理由のために春データJPAを使用したくない

PSは、だから私の懸念がある私は/サービス層豆範囲を維持する必要がありますかDAO層 豆は試作品ですか?

  • これに対して、Beanはシングルトンとして保存する必要があります。

また、私はDAO層のメソッドを同期する必要がありますか?または 休止状態の セッションはスレッドセーフではないため、getCurrentSession()は常に新しいセッションを返します。

セッションはSpring Beanとして、デフォルトではSingletonであるため、すべての要求に対してインスタンスが1つしかありません。

spring-rest-dataプロジェクトの使用を検討しましたか?

+0

getcurrentsessionメソッドは、上記の構成を考慮して常に新しいセッションオブジェクトを返します。なぜなら、Springブートの埋め込みTomcatはリクエストごとに新しいスレッドを作成するからです。 –

+0

実装して、同等かどうかを確認し、本当に新しいオブジェクトかどうか確認してください。 – fg78nc

関連する問題