我正在使用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 main方法)中运行相同的测试。完成所需的时间减少到1小时。有没有其他方法可以扩展在一个java实例中。我使用Atomikos,Hibernate进行持久化。我配置了批处理,插入排序和更新排序。每个东西都正确批处理并且工作正常。 但我观察到在此期间 CPU 利用率不超过 30%。有没有办法利用更多处理器并对其进行扩展。
最佳答案
parallelStream()
基本上为您提供了“默认”实现。我听到一个人曾经说过:“每当你使用这个结构时,衡量它的效果”。
换句话说:当您对默认实现不满意时,您可能需要研究您自己的实现。不关注单一操作,而是关注“整体”。
示例:如果您将每个“镜头”的 5、10、50 个“用户”“标记”在一起会怎样 - 意思是:您减少了交易数量,但允许每个交易中包含更多内容。
是的,这是一个非常通用的答案 - 但这是一个非常通用的问题。我们完全不知道你的代码在那里做什么 - 所以这里没有人能告诉什么是减少整体运行时间的“完美”方法。
除此之外:您还想分析您的整个设置。也许你的问题不是“java”部分 - 而是你的数据库。内存不够,工作量太大……或者网络,或者,或者,或者。换句话说:首先专注于了解性能瓶颈真正存在的位置。
(关于“性能”和瓶颈的好读物:Michael Nygard 的古老经典“Release it”)
关于java - 使用并行流提高数据库密集型任务的 CPU 利用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45182470/