Вопрос

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

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

Является ли это плохим способом ведения дел - я "обязателен"? иметь отдельный Entity Bean, или как я должен очистить EntityManager?

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top