2008-11-20 40 views
1

我有一个运行在Oracle OCCAS服务器上的servlet。目前我使用@Entity annotaion将数据库中的一些数据映射到应用程序中的实体类。 虽然我无法注入EntityManager(@PersistenceContext),并且我的理解是因为它在我的servlet上下文中运行,而不是作为单独的实体EJB运行。 但是,通过EntityManagerFactory创建管理器的工作原理正是我现在使用的。如何在未注入时关闭EnityManager?

现在,在重新启动应用程序后,我得到了PermGen空间错误。我认为这与某种程度上的持久性有关。在我的finalize方法中调用了EntityManager.close(),但它从不在日志中显示。

这是一种糟糕的做事方式 - 我需要“有一个单独的实体Bean,或者我该如何清理EntityManager?

回答

1

我有一个类似的问题,并使用ThreadLocal和一个servlet过滤器解决它。

Here's a post on my blog detailing what you need to do;基本上你的servlet过滤器设置实体管理器,然后在servlet调用完成后关闭它;它使实体管理器可用作线程局部变量(根据Hibernate的推荐)。您还需要在过滤器中捕获异常并进行回滚。

顺便说一句,finalize不保证以您认为的方式调用。 finalize应当在JVM退出之前调用,但在此之外,可能需要很长时间。

+0

谢谢!我会尝试,或者可能去EJB路线。毕竟,那里有一个容器可以完成这项工作。 我认为在重新部署后,旧的应用程序对象应该准备好用于GC清理 - 特别是当PermGen运行不足时。好吧... – 2008-11-20 17:08:30