jpa weblogic资源分配限制

vcudknz3  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(63)

我有一个1000记录从Oracle数据库获取的列表.我想处理这个列表并发.因此我使用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在一些迭代.也似乎被中断,并没有完成循环.我认为如果我使用流而不是并行流将没有问题.但我需要做的多线程操作,以增加性能和减少处理时间(例如,如果我需要处理1万条记录列表)。下面是代码:

@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");
        }
    }


}
是否可以获取一些记录(例如20千),然后并发处理它们?我不想做的业务在pl/sql函数的一些原因.我想在java中管理整个业务.什么可以做优化这段代码?

yxyvkwin

yxyvkwin1#

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

相关问题