weblogic 资源分配限制

问题描述 投票:0回答:1

我有一个从 oracle 数据库获取的 1000 条记录的列表。我想同时处理这个列表。因此我使用了java并行流。问题是它在某些迭代中抛出了错误

weblogic.common.resourcepool.ResourceLimitException: No resources currently available in pool ERDS to allocate to applications, please increase the size of the pool and retry
。似乎也被中断并且没有完成循环。我想如果我使用流而不是并行流就不会有问题。但我需要通过多个线程进行操作以提高性能并减少处理时间(例如,如果我需要处理 10000 条记录列表)。这是代码:

@Singleton
@Startup
public class TPTimer {

@Inject
private Service service;

@Inject
Logger logger;

@Inject
EntityManager em;


@Schedule(hour = "11", persistent = false)
public void doTask() {
    try {
      
         
            sendSMS();
           
        
    } catch (Exception e) {
        logger.error(e.getMessage());
    }
}


private void sendSMS() {
    try {
        String txt = ".....";
        List<Object[]> list = em.createNativeQuery("some query")
                .setMaxResults(1000)
                .getResultList();

        list.parallelStream().forEach(t -> service.joinWithdebit(txt, t));
    } catch (Exception e) {
        logger.error(e);
    }
}

}

    @Stateless
    public class Service {


public void joinWithdebit(String txt, Object[] arr) {
        try {
            em.joinTransaction();
            List list = em.createNativeQuery("query")
                    .setParameter(1, String.valueOf(arr[2]))
                    .getResultList();
            if (list.size() > 0) {
                List res = em.createNativeQuery("q")
                        .setParameter(1, String.valueOf(arr[1]))
                        .setParameter(2, String.valueOf(arr[0]))
                        .getResultList();
                if (res.size() > 0)
                    sendSms(txt, arr);
          
            }
        } catch (Exception e) {
            Logger.getLogger(e);
        }
    }

     @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void sendSms(String txt, Object[] arr) {
        try {
            em.joinTransaction();
            User user = userManager.getUserByName(String.valueOf(arr[0]));
            boolean bool = smsService.isSmsSent(user, txt);
            if (bool) {
                String now = DateUtils.format(new Date(), "yyyyMMdd");
                em.createNativeQuery("insert into sms_table(...) values (?,?,?,?,?,?,?,?,SYSDATE)")
                        .setParameter(1, new BigDecimal(arr[0] + "5" + "01"))
                        .setParameter(2, String.valueOf(arr[2]))
                        .setParameter(3, "01")
                        .setParameter(4, String.valueOf(arr[0]))
                        .setParameter(5, now)
                        .setParameter(6, now)
                        .setParameter(7, user != null ? user.getMobile() : "-")
                        .setParameter(8, "5")
                        .executeUpdate();
            }
        } catch (Exception e) {
            Logger.getLogger(this.getClass().getName()).info("320220:error while sending sms");
        }
    }

}

可以获取一些记录(例如 2 万条)然后同时处理它们吗?由于某些原因,我不想在 pl/sql 函数中做生意。我想用java管理整个业务。可以做什么来优化这段代码?

java jpa concurrency weblogic
1个回答
0
投票

很明显 JDBC 池连接匮乏;如果您要运行并行线程,那么您需要处理池连接,这足以满足您的要求。

© www.soinside.com 2019 - 2024. All rights reserved.