多线程 – EntityManager线程安全和Java EE
我是EJB和hibernate的新手,以下让我感到困惑,因为每当我寻找明确的答案时似乎都会有矛盾.
题: 以下列方式将实体管理器直接注入无状态bean是否可以线程安全? @Stateless public class SomeBean implements SomeInterface { //.. @Inject private EntityManager entityManager; //... non related transaction1() //... non related transaction2() 是否每个无状态bean都有自己的EntityManager实例或共享实例可以注入? 根据Hibernate文档: EntityManager是一个廉价的,非线程安全的对象,应该只使用一次,用于单个业务流程,单个工作单元,然后丢弃. EJB容器是否使其线程安全? 根据EJB文档,无状态会话bean本身就是线程安全的,因为不允许不同的客户端同时在同一个bean上运行. 但是,我已经阅读了应该注入EntityManagerFactory而不是EntityManager的示例,如果直接注入EntityManager,则应该在Stateful bean中完成. 总是将EJB直接注入无状态bean(如上所示)或者什么是无用的情况下是否安全? 解决方法
两者都不是. @Inject(和@PersistenceContext和@EJB)注入代理实例,而不是实际实例. 代理将在每个方法上调用委托给当前线程和上下文中的正确可用实例.换句话说,容器担心这一切,而不是你. 也可以看看: > When using @EJB,does each managed bean get its own @EJB instance? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |