请banq等高手帮忙解答一下:tried to enter Stateful bean with different tx context?

03-09-15 lunxian
在一个页面上要请求某个sfsb的方法,但是这个页面可能同时产生多个,并且使用相同的sfsb实例,导致下面的异常。

一个解决办法是将sfsb改为slsb,但是除此外还没有其他的解决办法?

同样的,对sfsb的使用是否应该受到很大的限制?就像bruce说到的EJB中只有slsb和mdb有用?

09:53:19,437 ERROR [Engine] StandardWrapperValve[jsp]: Servlet.service() for servlet jsp threw exception

org.apache.jasper.JasperException: EJBException:; nested exception is:

javax.ejb.EJBException: Application Error: tried to enter Stateful bean with different tx context, contextTx: TransactionImpl:XidImpl [FormatId=257, GlobalId=yj//321, BranchQual=], methodTx: TransactionImpl:XidImpl [FormatId=257, GlobalId=yj//325, BranchQual=]

一串的at就不用写了

robbin
2003-09-15 15:09
SFSB确实这个问题不太好解决,而且SFSB的性能也容易产生问题,关注一下

我个人也同意只有SLSB和MDB有用的看法。

lunxian
2003-09-15 21:25
如果没有很好的办法解决,就只有改用slsb代替sfsb了。

还有一个东西有疑问:在《J2EE实施的问题 》中banq看到如下的解释:

如果能Sbean,应该能用JMS,如下图:

socketclient接受到数据后,如图左边是加入Queue,而另外一段是取数据,这是个典型的消息处理模型,左边使用sbean实施,而右边取出使用MDB(Message-Driven Beans),中间队列Queue可以交给JMS的。

其实JMS也可以使用在非EJB环境,如果不能使用JMS,正如你说的,右边必须是一个线程啊,sbean不是线程。

我不明白为什么sbean可以作为接收外部消息,感觉也需要线程来处理呀。

我做一个server端程序,要监听多个UDP端口,为了处理峰值并发,从socket中得到的数据首先放入到一个队列中,然后通过起多个线程来处理。这样场景下如何应用ejb呀?我现在的方案是用普通的application的方式,但通过一个load-on-startup的servlet来启动到Jboss环境中的。

lunxian
2003-09-18 18:48
为什么没有人关注一下这个问题?

Horser
2003-09-18 19:31
我感觉你面对的问题我以前碰到过,我冒昧的建议你是否可以把Application实现的功能放到Web上,用Servlet来完成功能,这样比你自己写很多线程管理等代码要好很多.

不知道你的具体应用,随便说说

banq
2003-09-19 09:39
使用sfsb要注意保存sfsb的引用,不管这个页面同时产生多少次,你以HttpSession来保存,这样一个用户只有一个sfsb实例。

lunxian
2003-09-19 10:58
就是在HttpSession中保存的对该sfsb的引用。这同样导致了对该sfsb的同一个实例的同时操作,导致并发问题。将sfsb方法的事务设置为Never(实际上不需要),则可能导致Application Error: no concurrent calls on stateful beans的异常。

EJB2.0的规范上说使用sfsb要主要防止多个线程同时访问同一个sfsb的实例。但是应该怎么做比较合适呀?

banq
2003-09-19 13:38
一个用户只有一个session,一个session保存一个sfsb实例引用,怎么会同时操作sfsb实例?又不是整个容器中只有一个sfsb实例噢。

lunxian
2003-09-19 22:04
实际场景是这样的:用户点击页面上的一个按钮,弹出一个新的页面,在新的页面中将从session中取出对sfsb的引用,然后调用sfsb的一个方法。

如果用户快速的点击按钮就会导致上一次调用还没有结束就开始了下一次调用。

现在我通过一个方法同步的proxy类来委托对sfsb的调用,暂时解决这个问题。

看petstore的代码,发现petstore中是通过WebControl在Servlet上同步对sfsb的调用,以避免多个线程访问sfsb的。

疑问是ShoppingCartEJB是一个sfsb,但其ejbCreate方法为什么没有参数呀?

猜你喜欢