0

単一の接続を使用して、Java を使用して Oracle データベースでクエリを実行します。この単一の結果セットから読み取るのではなく、複数のスレッドを使用する方が高速でしょうか?

読み取り操作のスレッドセーフを自分で実装することを検討してください。

単純に、複数のスレッドとの単一の接続を介して単一の結果セットから読み取るパフォーマンスの向上はありますか?

4

1 に答える 1

2

複数のスレッドを持つ単一の接続を介して単一の結果セットから読み取るパフォーマンスの向上はありますか?

これらのスレッドがすべて読み取りを行っている場合は、いいえ。複数のスレッドを使用すると、同時読み取りを防ぐために何らかの同期を行う必要があるため、速度が低下する可能性さえあります。したがって、複数のスレッドが順番に実行されることになります。単一の接続が、それを作成したスレッド以外のスレッドからアクセスできない場合もあります。

さて、あるデータベースから読み取り、別のデータベースに書き込みたい場合は、何らかの生産者と消費者の関係を使用した方がよいでしょう。プロデューサーはデータベースからデータを読み取り、データをキューに入れます。コンシューマ スレッドは、キューから読み取り、他のデータベースに書き込みます。

したがって、プロデューサーは次のようにします。

while not end of data
    read record
    put record on input queue
end-while
mark end of queue

消費者:

while not end of queue
    remove item from input queue
    write record to database
end-while

この構成では、スレッドが互いに独立して動作するため、パフォーマンスが大幅に向上します。ただし、共有キューは通常、この方法で同時アクセス用に最適化されたデータ構造です。たとえば、.NET にはBlockingCollectionこのための があります。他の環境では、おそらく非常に似たようなものがあります。

于 2013-10-03T18:41:44.833 に答える