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 コントローラに来るとき、私は原因
getcurrentsessionメソッドは、上記の構成を考慮して常に新しいセッションオブジェクトを返します。なぜなら、Springブートの埋め込みTomcatはリクエストごとに新しいスレッドを作成するからです。 –
実装して、同等かどうかを確認し、本当に新しいオブジェクトかどうか確認してください。 – fg78nc