@Transactional
public List<Order> getRecentOrders() {
return orderRepository.findRecent();
}
Видите здесь что-нибудь странное?
Аннотация
@Transactional на методе, который просто делает read/GET вызов.Хуже всего то, что по умолчанию
@Transactional работает в режиме read-write, то есть:- лишние блокировки ресурсов;
- база вынуждена обрабатывать транзакцию даже для простого SELECT.
Что можно сделать:
@Transactional(readOnly = true)
Это позволит:
Пропустить ненужные flush-операции в Hibernate.
Оптимизировать работу транзакций для SELECT-запросов.
Уменьшить оверхед от прокси и избежать лишних блокировок.
Правила, которые стоит помнить:
Не вешайте
@Transactional везде подряд только ради «красоты».Используйте
@Transactional(readOnly = true) для запросов.Убирайте
@Transactional, если методу вообще не нужна транзакция.Регулярно профилируйте приложение — мелкие ошибки выливаются в огромные потери производительности.
👉 Java Portal