Как закрыть EnityManager, когда не вводится? - PullRequest
1 голос
/ 20 ноября 2008

У меня есть сервлет, работающий на сервере Oracle OCCAS. В настоящее время я сопоставляю некоторые данные в базе данных с классом сущностей в моем приложении, используя аннотацию @Entity. Мне не удается внедрить EntityManager (@PersistenceContext), хотя, насколько я понимаю, он работает в контексте моего сервлета, а не как отдельный объект EJB. Создание менеджера через EntityManagerFactory, тем не менее, работает, и именно этим я сейчас и пользуюсь.

Теперь, после нескольких перезапусков приложения, я получаю сообщение об ошибке пространства PermGen. Я полагаю, это как-то связано с постоянством. В моем методе finalize есть вызов EntityManager.close (), но он никогда не отображается в журнале.

Это плохой способ делать что-то - мне «нужно» иметь отдельный компонент Entity Bean или как я должен очистить EntityManager?

1 Ответ

1 голос
/ 20 ноября 2008

У меня была похожая проблема, и я решил ее, используя ThreadLocal и сервлет-фильтр.

Вот пост в моем блоге, подробно описывающий, что вам нужно сделать ; в основном, ваш сервлет-фильтр устанавливает менеджер сущностей, а затем закрывает его после завершения вызова сервлета; он делает диспетчер сущностей доступным как локальную переменную потока (согласно рекомендации hibernate). Вам также нужно перехватить исключения в фильтре и выполнить откат.

Кстати, финализация не гарантируется так, как вы думаете. finalize следует вызвать до выхода из JVM, но вне этого может потребоваться много времени.

...