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

标签 java database oracle java-stream atomikos

我正在使用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/

相关文章:

java - Spring框架请求范围和单例 Autowiring

oracle - 是否可以使用 sqoop 导入表并添加额外的时间戳列?

linux - Oracle 设置默认 NLS_LANG

database - 是否有命令在 man-db 中安装的所有手册页中搜索字符串

oracle - 重启服务器后出现 ORA-12514

java - 插入前检查注册数据? JAVA

Java unchecked/checked 异常说明

java - Hibernate 在调用 findOne 时返回陈旧的对象

java - 使用sqlite数据库

mysql - 是否可以自动将 mysql 数据库备份到 dropbox?