Избавление от «Нет Hibernate Session, привязанного к потоку» и производительности с @Transactional на методах чтения

1

Я представил HibernateTransactionManager в своем проекте, потому что нам нужно использовать транзакции для некоторых методов обслуживания. Я также следовал наилучшей практике, чтобы внедрить SessionFactory в слой DAO вместо реализации HibernateDaoSupport.

Теперь в некоторых методах чтения, которые не аннотируются с @Transactional, я получил ошибку:

No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here

Я знаю, как его решить, просто добавьте @Transactional повсюду. Но мои коллеги беспокоятся о производительности. Следует также читать такие методы, как:

        return sessionFactory.getCurrentSession().createCriteria(MyClass.class).add(Restrictions.eq("color", color)).addOrder(Order.asc("createDate")).list();

аннотироваться с помощью @Transactional?

Я также прочитал этот пост. Некоторые пояснения к примечанию Spring @Transactional о методе, который препятствует использованию этой аннотации в слое DAO, поэтому я не вижу, что является наилучшей практикой для избавления от проблемы. И имеют хорошие показатели при чтении методов.

Большое спасибо за помощь!

Теги:
performance
spring
hibernate
transactions

1 ответ

2
Лучший ответ

Когда вы используете абстракцию Spring TransactionManager, вы всегда должны отмечать все методы службы:

  • @Transactional
  • @Transaction(readOnly = true) для методов только для чтения

Это связано с тем, что Hibernate больше не будет управлять транзакцией, но вместо этого он делегирует эту ответственность на платформу Spring. Если вы не помечаете каждый метод границ @Transactional аннотацией @Transactional, Spring не может связывать текущий поток с @Transactional Hibernate и связанным с ним соединением JDBC.

Таким образом, использование @Transactional не является вариантом.

  • 0
    Спасибо, Влад, так что readOnly = true прокладывает путь к хорошим показателям в методах чтения, или я должен ожидать ухудшения производительности. введя эти аннотации ко всем моим методам? На самом деле я читаю другие сообщения, подобные этому: stackoverflow.com/questions/27390963/…, который предлагает перенести операции только для чтения в отдельные службы ... Что вы думаете?
  • 0
    Транзакционная аннотация только для чтения в порядке. Это не повлияет на производительность вашего приложения. Обычно на производительность больше влияют менее оптимальные дБ-запросы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню