首页 > 解决方案 > 如何解决由于循环内繁重的数据库调用而导致的事务超时 - EJB

问题描述

如主题中所述,总超时时间为 120 秒,在处理事务时超过了。实现类似于下面的伪代码。

最初的想法是使用 TransactionAttributeType.NOT_SUPPORTED 将 methodA 从 tx 上下文中取出,并将代价高昂的 db 方法调用移至 REQUIRES_NEW(新事务)。但是考虑到方法 A 的实现,它非常忙碌。而且 db proc 已经优化到了最佳性能。

有什么解决方法吗:) 真的很感激

public String methodA(x){
 String resp;
    ------ other implementations
    
    if(x==10){
    
        for(int k; k < 10 ; k++){
            dbcall() --- method with heavy db proc which costs around 15seconds
        }
    }
    ------ other implementations

   return resp;
}

更新:更改超时持续时间不是一种选择

标签: javaejb

解决方案


对于 Bean Managed Transactions,可以使用 UserTransaction 接口的 setTransactionTimeout 方法设置超时时间,对于 Container Managed Transactions,应该使用服务器特定的配置(即对于 JBOSS,可以使用注解 org.jboss.ejb3.annotation.TransactionTimeout )。

例子:

    @TransactionTimeout(unit=TimeUnit.MINUTES, value=10)
    public void doAction() {
    

doAction 方法事务的有效期最长为 10 分钟,对于 bean 管理的事务也可以使用以下处理:

    public void doAction() {
        try {
            ut.setTransactionTimeout(60 * 10);
            ut.begin();

请注意,该方法将参数设为秒(即 10 分钟 = 10 * 60)。

资源

资源 2


推荐阅读