我有一个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中管理整个业务.什么可以做优化这段代码?
1条答案
按热度按时间yxyvkwin1#
很明显,JDBC池连接不足;如果您要运行并行线程,那么您需要处理池连接,这足以满足您的需求。