我有一个从 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管理整个业务。可以做什么来优化这段代码?
很明显 JDBC 池连接匮乏;如果您要运行并行线程,那么您需要处理池连接,这足以满足您的要求。