1

我有一个在 Oracle OCCAS 服务器中运行的 servlet。目前,我使用@Entity 注释将数据库中的一些数据映射到我的应用程序中的实体类。不过,我无法注入 EntityManager (@PersistenceContext),据我了解,这是因为它在我的 servlet 上下文中运行,而不是作为单独的实体 EJB 运行。但是,通过 EntityManagerFactory 创建管理器是可行的,所以这就是我目前使用的。

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

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

4

1 回答 1

1

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

这是我博客上的一篇文章,详细说明了您需要做什么;基本上,您的 servlet 过滤器设置实体管理器,然后在 servlet 调用完成后将其关闭;它使实体管理器可用作线程局部变量(根据休眠的建议)。您还需要在过滤器中捕获异常并进行回滚。

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

于 2008-11-20T15:45:14.263 回答