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;
}
這是正確的說,儘管Spring bean的默認範圍是單身人士,
EntityManager
是線程安全的,因爲Spring使用ThreadLocal
來綁定其交易並且EntityManager
它?上面的Servlets示例在Spring中是否仍然有效?它仍然不是線程安全的嗎?
ThreadLocal
方法僅適用於Spring託管的bean,而普通的servlet不是其中之一嗎?據我記憶,注射
EntityManager
是集裝箱的責任。在Glassfish Java EE實現中,應用服務器發現@PersistenceContext
作爲注入點。
它在春天看起來如何? Spring框架是否負責發現這些註釋或者它是JPA實現者的責任?
謝謝拉爾夫。所以,通過說「2)不是」,你的意思是說它不是線程安全的,因爲這個servlet不是一個Spring bean,所以實際上**不會發生任何注入**?是否有可能將這樣的Servlet標記爲Spring bean?我以某種方式覺得這是非常罕見的,不推薦的和凌亂的想法 - 這只是理解Spring的機制的理論問題。 –
我的意思是它根本就不是Spring bean(這是關於第一段的內容),所以沒有注入,而'em'將爲空。 - 測試它,如果它不是null,那麼真的很奇怪。你可以嘗試使它成爲spring bean的一種方法是「@ Configurable」,但這需要真正的AspectJ,我真的不知道這是否適用於Servlet。 – Ralph