有状态会话Bean多线程访问

3
EJB 3.2规范如下所述:
默认情况下,客户端被允许对有状态会话对象进行并发调用,并且容器需要序列化这样的并发请求。请注意,容器从不允许多线程访问实际的有状态会话Bean实例。
对我而言,并发访问和多线程访问似乎是等价的。那么,在禁止多个线程的情况下如何对有状态EJB进行并发调用呢?
2个回答

4
你是对的:只有在多线程的情况下才能进行并发调用。因此,在谈论并发性时,涉及到多个线程。
规范清楚地指出,容器不允许同时访问一个有状态会话bean实例。如果存在并发调用(来自多个线程),容器必须将它们串行化。
请注意,当然可以有几个该有状态会话bean的实例,这些实例当然可以由多个客户端访问。
此外 - 这可能让你感到困惑 - 规范说一个客户端(而不是容器)被允许进行并发调用,但容器必须将它们串行化。

这是否意味着我可以使用@EJB注释将有状态的EJB安全地注入到Servlet中,并且来自多个线程的多个HTTP请求可以调用单个共享有状态的EJB,但是SFSB的方法永远不会并发运行,因为容器将序列化对SFSB的调用,如果在方法已经运行时更多的调用到达SFSB,则会出现ConcurrentAccessException? - pepe
您将不会收到异常。容器将对有状态会话Bean实例的所有传入调用(可能同时发生)进行序列化处理。只会有一个线程运行一个实例的方法。 - Seelenvirtuose
我明白了。默认情况下,所有访问尝试都将无限期等待运行的机会。只有在指定AccessTimeout注释的值高于-1且访问尝试超时时,我才会收到ConcurrentAccessException。 - pepe

1
一个有状态的会话bean可以处理并发请求。但是,这些调用实际上并不会同时访问您编写的bean类。应用程序服务器对这些请求进行序列化。因此,在给定时间内,只有一个线程执行bean类方法。
所以问题在于,有状态会话bean的并发调用并不等同于并发访问。
这种并发级别只处理相同会话的请求。来自不同会话的请求使用不同的对象处理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接