2008-11-20 21 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

相關問題