【发布时间】:2017-07-19 06:26:27
【问题描述】:
我正在使用 java 8 并行流将数据插入数据库。 以下是代码
customers.parallelStream().forEach(t->{
UserTransaction userTransaction = new UserTransactionImp();
try {
userTransaction.begin();
userTransaction.setTransactionTimeout(300);
//CODE to write data to DB for each customer in a global transaction using atomikos and hibernate
userTransaction.commit();
}catch(Exception e){
userTransaction.rollback();
}
});
完成任务需要2个多小时。我在两个不同的实例(两个java主要方法)中运行了相同的测试。完成所需的时间降至1小时。有没有其他方法可以扩大规模在一个 java 实例中。我正在使用 Atomikos,Hibernate 进行持久性。我已经配置了批处理,插入排序和更新排序。Evrything 已正确批处理并且工作正常。 但我观察到在此期间 CPU 的使用率没有超过 30%。有什么办法可以利用更多的处理器并扩大规模。
【问题讨论】:
-
您是否使用了连接池,以便它们在与数据库通信时不会相互阻塞?您在填充数据库时使用的任何其他可能导致线程相互阻塞的共享资源?
-
您还应该知道,使用并行流有一些注意事项,尤其是在它们上运行 I/O 代码时。 dzone.com/articles/think-twice-using-java-8
-
尝试使用自定义 ForkJoinPool 来运行并行流并调整线程数。
-
我使用了自定义 ForkJoinPool 。结果还是一样
-
是的,我正在使用连接池。
标签: java database oracle java-stream atomikos