我有一个在Oracle OCCAS服务器上运行的servlet。目前,我使用@Entity annotaion将数据库中的一些数据映射到我的应用程序中的实体类。 我没有注入EntityManager(@PersistenceContext),据我所知,这是因为它在我的servlet上下文中运行而不是作为单独的Entity EJB。 但是,通过EntityManagerFactory创建管理器是有效的,所以这就是我目前使用的。
现在,经过多次重启应用程序后,我得到了一个PermGen空间错误。我认为这与某种程度上的持久性有关。在我的finalize方法中调用了EntityManager.close(),但它从未显示在日志中。
这是一种糟糕的做事方式 - 我是否“需要”拥有一个单独的实体Bean,或者我应该如何清理EntityManager?
答案 0 :(得分:1)
我遇到了类似的问题,并使用ThreadLocal和servlet过滤器解决了这个问题。
Here's a post on my blog detailing what you need to do;基本上你的servlet过滤器设置实体管理器,然后在servlet调用完成后关闭它;它使实体管理器可用作线程局部变量(根据hibernate的推荐)。您还需要捕获过滤器中的异常并进行回滚。
BTW,并不保证以你认为的方式调用finalize。应该在JVM退出之前调用finalize
,但除此之外,它可能需要很长时间。