2012-04-30 77 views
10

EntityManager非線程安全的定義。 Servlets規範說,在非分佈式環境中並且沒有實現SingleThreadModel,每個定義只有一個servlet實例@PersistenceContext EntityManager在Spring和Java EE中的線程安全性

因此,在Java EE當你注入的EntityManager通過@PersistenceContext成Servlet的領域 - 這不是線程安全的:

public class MyServlet extends HttpServlet { 

    // Not thread-safe, should be using EMF instead. 
    @PersistenceContext 
    private EntityManager em; 
} 
  1. 這是正確的說,儘管Spring bean的默認範圍是單身人士,EntityManager是線程安全的,因爲Spring使用ThreadLocal來綁定其交易並且EntityManager它?

  2. 上面的Servlets示例在Spring中是否仍然有效?它仍然不是線程安全的嗎?

  3. ThreadLocal方法僅適用於Spring託管的bean,而普通的servlet不是其中之一嗎?

  4. 據我記憶,注射EntityManager是集裝箱的責任。在Glassfish Java EE實現中,應用服務器發現@PersistenceContext作爲注入點。
    它在春天看起來如何? Spring框架是否負責發現這些註釋或者它是JPA實現者的責任?

回答

5

問題2,3和4 - Spring不關注任何不是Spring Bean的類。因此,Spring不關注你MyServlet類。 因此,對於

  • 2)的答案是否定的
  • 3)只Spring管理豆
  • 4)它是春天的責任,因爲春天是集裝箱

問題1)。它以這種方式工作,所以Spring注入實體管理器的使用是有效的線程保存。

+0

謝謝拉爾夫。所以,通過說「2)不是」,你的意思是說它不是線程安全的,因爲這個servlet不是一個Spring bean,所以實際上**不會發生任何注入**?是否有可能將這樣的Servlet標記爲Spring bean?我以某種方式覺得這是非常罕見的,不推薦的和凌亂的想法 - 這只是理解Spring的機制的理論問題。 –

+1

我的意思是它根本就不是Spring bean(這是關於第一段的內容),所以沒有注入,而'em'將爲空。 - 測試它,如果它不是null,那麼真的很奇怪。你可以嘗試使它成爲spring bean的一種方法是「@ Configurable」,但這需要真正的AspectJ,我真的不知道這是否適用於Servlet。 – Ralph

相關問題