我们多年前的WebLogic J2EE应用程序有一个消息驱动的bean,它使用无状态会话bean。 MDB onMessage方法获取无状态会话bean的home接口,并调用home接口的create()
方法来获取实际的无状态会话bean本身。
代码不会尝试缓存会话bean,只是直接使用它:
public void onMessage(Message message)
{
...
MySessionBeanLocal ejbLocal = MySessionBeanLocalHome.create();
ejbLocal.myMethod();
MDB中没有相应的remove()
电话。
我的问题是:在这种情况下不打电话给remove()
是不是很糟糕?
我很确定需要为{em> ful 会话bean调用remove()
,但如果remove()
调用是必需的话,我不太清楚状态的少
我们最近取得了显着的性能提升,但突然开始耗尽有状态会话bean,但有异常:
java.lang.RuntimeException: An invocation of EJB MyMessageDrivenBean(Application:
MyApplication, EJBComponent: MyApplication.jar) timed out while waiting to get an instance from the free pool.
at weblogic.ejb20.pool.StatelessSessionPool.waitForBean(StatelessSessionPool.java:229)
at weblogic.ejb20.pool.StatelessSessionPool.getBean(StatelessSessionPool.java:100)
at weblogic.ejb20.manager.StatelessManager.preInvoke(StatelessManager.java:140)
at weblogic.ejb20.internal.BaseEJBLocalObject.preInvoke(BaseEJBLocalObject.java:228)
at weblogic.ejb20.internal.StatelessEJBLocalObject.preInvoke(StatelessEJBLocalObject.java:53)
at MyMessageDrivenBean_x56omo_ELOImpl.processMessage(MyMessageDrivenBean_x56omo_ELOImpl.java:28)
at MyMessageDrivenBean.onMessage(TBMessageListener.java:94)
at weblogic.ejb20.internal.MDListener.execute(MDListener.java:370)
at weblogic.ejb20.internal.MDListener.onMessage(MDListener.java:262)
at weblogic.jms.client.JMSSession.onMessage(JMSSession.java:2678)
我们的MDB池设置为:
<message-driven-descriptor>
<pool>
<max-beans-in-free-pool>20</max-beans-in-free-pool>
<initial-beans-in-free-pool>5</initial-beans-in-free-pool>
我们的无状态会话bean池设置为:
<stateless-session-descriptor>
<pool>
<max-beans-in-free-pool>50</max-beans-in-free-pool>
<initial-beans-in-free-pool>5</initial-beans-in-free-pool>
我的问题是,在无状态会话bean上调用create()
的MDB是否也负责为状态 less 会话bean调用remove()
? (该应用程序似乎已经运行多年而没有调用remove()
,但我想知道改进的吞吐量是否暴露了旧的错误。)
答案 0 :(得分:0)
在远程接口对象被攻击之后,无论如何都会调用remove()方法。 我认为没有EJB应用程序应该强制显式调用remove()方法,如果发生这种情况,可能是因为池太小了。当然,你总是打电话给微调,但这应该是一个例外,而不是规则。