2017-07-19 1 views
0

DBにデータを挿入するためにjava 8並列ストリームを使用しています。 次は、2つの異なるインスタンス(2つのJavaの主な方法)で完了するのに要する時間【選択を実行している同じテストを1に降りてきた、それはtask.Iを完了させるために2時間以上を要しコードDB集約型タスク用の並列ストリームを使用してCPU使用率を向上させよう

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(); 
     } 
    }); 

です1つのjava intance内でスケールアップする他の方法はありませんか?私は永続性のためにAtomikos、Hibernateを使用しています。私はバッチ処理を設定していました。 しかし、私はこの間にCPUが30%以上利用されていないことに気付きました。プロセッサーを増やして拡張する方法はありません。

+0

あなたは、接続プールを使用していますか?スレッドを互いにブロックさせている可能性のあるデータベースを作成するときに使用している他の共有リソース – Raniz

+1

また、パラレルストリームの使用には、特にI/Oコードを実行するときに注意が必要であることに注意してください。 https://dzone.com/articles/think-twice-using-java-8 – Raniz

+0

カスタムForkJoinPoolを使用して、並列ストリームを実行し、スレッド数を調整してみてください。 –

答えて

1

parallelStream()は、基本的に "デフォルト"の実装を提供します。私は男が一度こう言っていると聞いた: "あなたがこの構造物を使うたびに、その効果を測定する"。

つまり、デフォルトの実装に満足できない場合は、独自のの実装を調べる必要があります。単一の操作ではなく、 "全体の画像"に焦点を当てています。

例:「ショット」あたり5,10,50人の「ユーザー」を一緒に「バッジする」とはどういう意味ですか?つまり、トランザクションの数を減らし、より多くのコンテンツをそれぞれに入れることができます。

はい、これはかなり一般的な回答ですが、これはかなり一般的な質問です。私たちはあなたのコードがそこで何をしているのかについて全く洞察を持っていません - ここで誰も全体的なランタイムを減らすための "完璧な"方法を教えることはできません。

それ以外では、のプロファイルを設定します。たぶんあなたの問題は "java"の部分ではなく、あなたのデータベースです。メモリが不足していたり​​、作業量が多すぎたり、ネットワーク、または、または、または。言い換えれば、最初のは、パフォーマンスのボトルネックが本当に存在する場所を理解することに重点を置いています。

(「パフォーマンス」とボトルネックについての良い読み取り:マイケルNygårdのことで、「それをリリース」古い古典的な)データベースと通信するとき、彼らはお互いをブロックしないよう

+0

問題はアトミコスのようです。実行時間の80%以上を占めています – pppavan