@PersistenceContext EntityManager-Threadsicherheit in Spring und Java EE
EntityManager
istnicht threadsicher per Definition. Servlets-Spezifikationen besagen, dass in einer nicht verteilten Umgebung und ohne ImplementierungSingleThreadModel
, es gibtNur eine Servlet-Instanz pro Definition.
Daher in Java EE, wenn Sie ein injizierenEntityManager
durch die@PersistenceContext
in Servlets Feld - es ist nicht threadsicher:
<code>public class MyServlet extends HttpServlet { // Not thread-safe, should be using EMF instead. @PersistenceContext private EntityManager em; } </code>
Ist das richtig zu sagen, dass, obwohl der Standardbereich von Spring Beans Singleton ist, dieEntityManager
ist thread-safe wie die Feder verwendetThreadLocal
seine Transaktion zu binden undEntityManager
dazu?
Ist das obige Servlet-Beispiel im Frühjahr noch gültig? Ist es immer noch nicht threadsicher?
Tut dasThreadLocal
Ansatz funktioniert nur für Spring Managed Beans und einfaches Servlet ist nicht einer von denen?
Soweit ich mich erinnere, liegt es in der Verantwortung des Containers, das zu injizierenEntityManager
. Bei der Implementierung von Glassfish Java EE hat der Anwendungsserver den erkannt@PersistenceContext
als Injektionsstelle.
Wie sieht es im Frühling aus? Ist das Spring Framework für die Ermittlung dieser Anmerkungen verantwortlich oder ist es für den JPA-Implementierer verantwortlich?