Обработка одновременного запроса с помощью SpringBoot и Hibernate

112
13

Я создаю веб-приложение с помощью SpringBoot. В моем приложении у меня есть уровень RestController, который вызовет Service Layer, который, в свою очередь, вызовет слой DAO. Уровень моего сервиса аннотируется с помощью @Transactional (весенняя транзакция)

Я реализовал слой DAO с использованием универсального DAO Hibernate

    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-слоев в качестве прототипа? Кроме того, мне нужно синхронизировать методы в слое DAO? или getCurrentSession() всегда будет возвращать новый сеанс, поскольку сеанс hibernate не является потокобезопасным.

PS Я не хочу использовать Spring Data JPA из-за некоторых конкретных причин

спросил(а) 2021-01-19T15:43:13+03:00 9 месяцев назад
1
Решение
104

Поэтому я беспокоюсь, когда к моему REST-контроллеру приходит несколько одновременных запросов. Нужно ли мне поддерживать область bean-компонентов /DAO-слоев в качестве прототипа?

    Напротив, вам нужно держать боб в качестве Singleton.

Кроме того, мне нужно синхронизировать методы в слое DAO? или getCurrentSession() всегда будет возвращать новый сеанс, поскольку сеанс hibernate не является потокобезопасным.

Вы выполняете сеанс как Spring Bean, а по умолчанию - Singleton, поэтому для всех запросов будет только один экземпляр.

Считаете ли вы использование проекта Spring-Rest-data?

ответил(а) 2021-01-19T15:43:13+03:00 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема