使用并行流来增加数据库密集型任务的CPU利用率

时间:2017-07-19 06:26:28

标签: java database oracle java-stream atomikos

我使用java 8并行流将数据插入到DB中。 以下是代码

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 intance.I我使用Atomikos,Hibernate持久化。我已配置批处理,插入订单和更新订单.Evrything正确批处理,工作正常。 但我观察到CPU在此期间的利用率不超过30%。有没有办法利用更多的处理器并扩展它。

1 个答案:

答案 0 :(得分:1)

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

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

示例:如果你"徽章" 5,10,50和#34;用户"每拍摄一次" - 意思是:减少交易次数,但允许更多内容进入每个交易。

是的,这是一个非常通用的答案 - 但这是一个非常通用的问题。我们绝对没有任何见解你的代码在那里做什么 - 所以没有人可以告诉你什么是#34;完美"减少整体运行时间的方法。

除此之外:您希望配置文件整个设置。也许你的问题不是" java"部分 - 但你的数据库。没有足够的内存,太多的工作量......或网络,或者,或者。换句话说:第一个专注于了解您的性能瓶颈真正存在的位置。

(好的阅读"表现"和瓶颈:旧经典"发布它" Michael Nygard)