Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSF环境下EntityManager的线程安全_Jsf_Jpa_Jboss_Ejb 3.0 - Fatal编程技术网

JSF环境下EntityManager的线程安全

JSF环境下EntityManager的线程安全,jsf,jpa,jboss,ejb-3.0,Jsf,Jpa,Jboss,Ejb 3.0,以下模式是否存在任何线程安全问题或其他代码气味 注入容器管理的EntityManager的无状态EJB3 bean: .. 然后,视图范围内的JSF托管支持bean被注入上述服务bean: 部署环境是JBoss7,带有默认的HibernateJPA实现 我问的原因是,在模拟数百名用户的压力测试中,我们注意到JPA实体值(数据库中不存在的值)被破坏这可能意味着在处理JPA实体的实体管理器上存在某种竞争条件/线程不安全的访问。这看起来更像是JPA组件实现或数据库的问题,而不是web应用程序线程安全问

以下模式是否存在任何线程安全问题或其他代码气味

注入容器管理的EntityManager的无状态EJB3 bean: .. 然后,视图范围内的JSF托管支持bean被注入上述服务bean: 部署环境是JBoss7,带有默认的HibernateJPA实现


我问的原因是,在模拟数百名用户的压力测试中,我们注意到JPA实体值(数据库中不存在的值)被破坏这可能意味着在处理JPA实体的实体管理器上存在某种竞争条件/线程不安全的访问。

这看起来更像是JPA组件实现或数据库的问题,而不是web应用程序线程安全问题。注入无状态会话bean时,您会得到真实ejb的代理,并且当您调用该代理将获得一个新的ejb实例和一个新的实体管理器。因此,您使用的模式是正确的。可能您必须修改您的实体、查询和数据隔离。@MarcusJuniusBrutus我同意Adrian的观点。此外,您还没有显示保存数据的JPA组件(您的实体和在该实体上操作的类/方法)。是否确保您的客户端事务足够宽以确保一致性,即您是否在PageFooController中多次调用serviceA,并期望调用一起提交?如果是这样,您需要将UserTransaction注入PageFooController并调用begin()/commit()。为什么要调用getDelegate()?例如servlet中的代码:userService=(用户服务)ctx.lookup(…);UserTransaction tx=(UserTransaction)ctx.lookup(“java:comp/UserTransaction”);tx.begin();//注释掉这一行以获得“未能延迟初始化集合”(hibernate作为jpa提供程序)User User=userService.getUserById(1);user.getAccounts().iterator().next();//我还假设您没有使用以下内容:TransactionAttribute.REQUIRES\u NEW
@Stateless
public class ServiceA implements IServiceA.ILocal {
    @PersistenceContext(unitName="foo")
    private EntityManager em
    ...
@ManagedBean
@ViewScoped
public class PageFooController {
    @EJB
    private IServiceA.ILocal serviceA;
    ....