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





У меня была аналогичная проблема, и я решил ее с помощью ThreadLocal и фильтра сервлета.
Вот сообщение в моем блоге с подробным описанием того, что вам нужно сделать; в основном ваш фильтр сервлета устанавливает диспетчер сущностей, а затем закрывает его после завершения вызова сервлета; он делает диспетчер сущностей доступным как локальную переменную потока (согласно рекомендации спящего режима). Также нужно отлавливать исключения в фильтре и делать откат.
Кстати, finalize не может быть вызван так, как вы думаете. finalizeдолжен будет вызываться перед завершением работы JVM, но в остальном это может занять много времени.
Спасибо! Я попробую это, или, возможно, пойду по пути EJB. В конце концов, там есть контейнер, который может выполнить эту работу ... Я подумал, что после повторного развертывания старый объект приложения должен быть готов для очистки GC - особенно когда PermGen заканчивается. Ну что ж...