我有一个在IBM WebSphere Application Server 8中运行并具有EJB 3.0无状态Bean的应用程序。这个bean调用一个由EJB 2无状态Bean组成的服务。第二个bean在for循环中调用。这意味着被称为至少300次。该过程发生在交易中。 第一个bean标记为:
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
第二个豆子:
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
有时整个交易需要超过60秒。出于这个原因,我将事务超时设置为600秒:
totalTranLifetimeTimeout="600"
LPSHeuristicCompletion="ROLLBACK"
propogatedOrBMTTranLifetimeTimeout="600"
但我仍然遇到一个问题,我没有找到原因和解决方案。 从第一次调用开始60秒后,服务(方法B)为事务设置属性rolebackonly为true。这些方法一直运行到最后,但由于这一点,数据库中没有任何东西保存 - 所有东西都被回滚。
我找不到解决方案来获取有关将其设置为true(容器或数据库)的组件的更多信息以及出于何种原因。
我希望我解释一切正确,任何想法或解决方案都将受到高度赞赏。
答案 0 :(得分:0)
如果设置了“应用程序组件事务超时”,它将覆盖全局超时值,如this knowledge center page上的表1,2所示。 这是另一个knowledge center page,它描述了如何配置组件事务超时。检查它是否设置为60,如果是,则增加该值。
另外,刚才注意到你提到它是一个远程EJB调用,所以你还应该查看Client Inactivity Timeout的值,它的默认值是60秒,&#34;指定最大持续时间,以秒为单位,来自远程客户端的事务请求之间。任何超过此超时的客户端不活动时间都会导致事务在此应用程序服务器中回滚。&#34;根据第一个链接的知识中心文档。