Flaky Hibernate сессия? - PullRequest
       5

Flaky Hibernate сессия?

2 голосов
/ 22 апреля 2011

Hibernate иногда выдает мне эту ошибку: org.hibernate.LazyInitializationException: не удалось инициализировать прокси - нет сеанса.

Теперь: я знаю, я знаю - это означает, что сущность, над которой я работаю, отсоединилась от сеанса, поэтому она не может инициализировать любые свойства, которые загружаются лениво. Однако проблема не воспроизводима на 100%. Это никогда не происходит при новых развертываниях, поэтому мы решаем проблему (по крайней мере на некоторое время), перезапуская испорченные серверы.

У нас действительно включен кэш в памяти, но я не могу понять, как кеширование может взаимодействовать с отложенной загрузкой, чтобы вызвать эту проблему. Кроме того, почему мы никогда не увидим эту проблему на новых серверах, только на серверах, которые были запущены некоторое время?

1 Ответ

0 голосов
/ 22 апреля 2011

Такое исключение LazyInitializationException обычно генерируется при использовании объекта из старого устаревшего сеанса гибернации. Например, у вас есть два запроса:

Object o = null;

Request 1:
Session s1 = ...;
o = s1.get(MyObject.class, myId);
s1.close();

Request 2:
o.getFoo().getBar(); //May throw a lazyinit exception

Здесь будет генерироваться исключение LazyInitializationException, если файл o.foo.bar не был загружен в запросе 1. Вам необходимо исправить код, чтобы запрос 2 получал новый сеанс со свежей копией объекта. Проблемы такого рода сложно найти; проверять объекты, которые вы держите между запросами, когда ни один запрос не обрабатывается (я обнаружил, что jvisualvm или jprobe могут быть благом). Часто источник проблемы не очевиден; анонимные классы могут вызвать удержание ссылки, например.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...