EntityManager
不是线程安全的。
Servlets规范说在非分布式环境中并且没有实现SingleThreadModel
,每个定义只有一个servlet实例。
因此,在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
来绑定它的事务和{{1它呢?
以上Servlets示例在Spring中仍然有效吗?它仍然不是线程安全的吗?
EntityManager
方法是否仅适用于Spring托管bean,而普通servlet不是其中之一?
据我记忆,注入ThreadLocal
是容器的责任。在Glassfish Java EE实现中,应用程序服务器发现EntityManager
作为注入点
它在Spring中看起来如何? Spring Framework是否负责发现这些注释或JPA实现者的责任?
答案 0 :(得分:6)
问题2,3和4 - Spring不关注任何不是Spring Bean的类。因此,Spring并不关注你MyServlet
课程。
因此答案为
问题1)。它以这种方式工作,因此Spring Injected Entity Manager的使用是有效的线程保存。