使用并行流提高数据库密集型任务的 CPU 利用率



我正在使用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 int 中向上扩展。我正在使用Atomikos,Hibernate进行持久性。我已经配置了批处理,插入排序和更新排序。Evrything已正确批处理并且工作正常。 但我观察到在此期间 CPU 的利用率不超过 30%。有没有办法利用更多的处理器并扩大它。

>parallelStream()基本上给你一个"默认"的实现。我曾经听一个人说:"每当你使用这个结构时,都要测量它的效果"。

换句话说:当您对默认实现不满意时,您可能需要查看自己的实现。不是专注于单一操作,而是"全貌"。

示例:如果您将每个"镜头"5、10、50 个"用户"标记"在一起,这意味着:您减少了交易数量,但允许更多内容进入每个交易。

是的,这是一个非常笼统的答案 - 但这是一个非常笼统的问题。我们完全不知道你的代码在那里做了什么 - 所以这里没有人能说出什么是减少整体运行时的"完美"方法。

除此之外:您希望分析整个设置。也许你的问题不是"java"部分 - 而是你的数据库。内存不足,工作量太大...或网络,或,或,或。换句话说:首先专注于了解性能瓶颈真正存在的地方。

(关于"性能"和瓶颈的好读物:迈克尔·尼加德的老经典"释放它"(

最新更新