2012-02-13 2 views
0

У меня есть метод, который потенциально может совершать много вызовов в базе данных при проверке списка объектов, использующих Hibernate по умолчанию. Если я аннотирую его @Transactional, он работает почти в четыре раза быстрее. Несколько вопросов:Зачем нужна помощь @Transactional в Spring

1) Почему это происходит быстрее?

2) Как я могу воспроизвести это увеличение скорости, не делая метод транзакционным? Мне абсолютно не нужно обертывать этот метод в транзакцию и сделать транзакцию несовместимой с реальным намерением метода.

+1

Возможно, транзакционное изменение количества записей db (уменьшает его)? Вы можете включить ведение журнала отладки для базовых команд sql, чтобы узнать. – Kevin

+0

Это ситуация, доступная только для чтения. Я могу сказать, однако, что это, по-видимому, не уменьшает количество раз, когда обратимый преобразователь Hibernate получает экземпляр, но он уменьшает количество времени между каждой составляющей. – Derek

+3

Я считаю, что это связано с сеансом hibernate - вы должны убедиться, что для всех вызовов существует только один, поскольку это очень дорогой объект. С '@ Transactional' всегда бывает так, что вы не можете сделать это вручную, с фильтром OpenSessionInView, возможно, другими способами. Также нет причин, чтобы избежать '@ Transactional'. – mrembisz

ответ

1

Я верю, что происходит то, что ваша логика базы данных требует транзакции. Если выполняется транзакция, например, из-за создания Spring, основанного на вашей аннотации, эта операция будет присоединяться к ней. Если транзакции не выполняются, им придется пройти процесс получения соединения, начать транзакцию и, вероятно, настроить сеанс Hibernate для каждого вызова.

Как это расходится с намерением вашего метода?

+0

Логика не транзакционная - мне не нужны никакие вид атомарности - он просто прокручивает кучу сущностей, чтобы узнать, находятся ли они в базе данных. Цель метода - просто проверить, чтобы все сущности, которые были переданы, еще не находятся в БД. Если этот метод является @Transactional, он становится помеченным как RollbackOnly, и я не могу продолжить то, что хочу. – Derek

+0

Почему вы не хотите проверять и вставлять одну транзакцию? Это случай учебника для желаемой изоляции транзакций. – Olaf

Смежные вопросы