2013-10-04 71 views
2

我有一個要求,我們創建一個Statelebean,它在EJB3環境中創建一個Container Managed EntityManager實例(使用@PersistenceContext)。 在這個創建的單個Stateless bean中,我們創建了在特定時間間隔內執行的線程。這個線程將運行數月。 我對從容器中獲取的單個EntityManager實例(使用CMP)是否可用於整個生命週期(> 1年)存在疑問。Entitymanager實例的生命週期

回答

1

EntityManager的生命週期:我認爲這更多的是DB連接生命週期的問題。在這種情況下,當JPA提供程序檢測到連接超時時,如果您配置了JDBC連接字符串wth autoReconnect=true,則您會期望建立另一個連接。此外,你應該尋找設置超時的可能性。

另一方面,您可能會忽略在EJB中您不允許打開新線程。就你而言,當涉及到管理實體(在不同線程中進行更改)和交易問題時,你會遇到一些問題。相反,我會使用Timer Service

1

一個EntityManager似乎意味着代表一個事務空間。對我來說,在一個長期存在的線程的整個生命週期中使用單個事務空間是沒有意義的,但這取決於你的設計和提供者實現的可行性。如果您要使用單個EM,請確保它不在線程之間共享,並監視其資源使用情況,因爲它們是JPA要求將通過它們讀取的每個實體都緩存爲受管實例;您可能需要偶爾調用em.clear()來分離託管實例,以便它們可以在邏輯點進行垃圾回收。

我不認爲注入會起作用,因爲容器應該將EntityManager綁定到注入到的bean的生命中,而不是線程的生命。您將需要獲取EntityManagerFactory,併爲您的線程獲取/管理您自己的EntityManager生命週期。