Наше летнее J2EE-приложение WebLogic имеет управляемый сообщениями компонент, который использует сессионный компонент без сохранения состояния. Метод MDB onMessage получает домашний интерфейс сессионного компонента без сохранения состояния и вызывает метод create()
домашнего интерфейса, чтобы получить сам фактический сессионный компонент без сохранения состояния.
Код не пытается кешировать сессионный компонент, просто использует его напрямую:
public void onMessage(Message message)
{
...
MySessionBeanLocal ejbLocal = MySessionBeanLocalHome.create();
ejbLocal.myMethod();
В MDB нет соответствующего вызова remove()
.
У меня вопрос: не плохо ли в этом случае звонить remove()
?
Я вполне уверен, что нужно вызвать remove()
для состояния ful сессионный компонент, но мне менее понятно, необходим ли вызов remove()
для состояния меньше .
Недавно мы значительно улучшили производительность, но внезапно начали исчерпывать сессионные компоненты с состоянием под нагрузкой, за исключением:
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>
Наш пул сессионных компонентов без сохранения состояния имеет значение:
<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>
У меня вопрос: MDB, который вызывает create()
для сессионного компонента без состояния, также отвечает за вызов remove()
для состояния минус сессионный компонент? (Похоже, что приложение работало годами без вызова remove()
, но мне интересно, обнаружила ли повышенная пропускная способность старую ошибку.)