2016-07-09 4 views
3

データベーステーブルにパラレルにアクセスするときに、Schedulers.io()またはSchedulers.newThread()を使用する必要があるのだろうかと思います。並列データベース検索のSchedulers.io()

例えば、私がSchedulers.io()を使用して何千ものテーブルのレコードを並行して選択すると、新しく作成されたスレッドの多くは、タスクの後のスレッドプールにあります。そのようなタスクが夜間バッチであれば

Observabe.just("table1", "table2", "table3"...) 
    .flatMap(t -> { 
     // creating the observable that emits the record 
     return Observable create(s -> { 
        Record rec = selectFrom(t); 
        s.onNext(rec); 
        s.onCompleted(); 
       }) 
       .subscribeOn(Schedulers.io()); // select in parallel 
    })... 

しかし、これらのスレッドは、それらのほとんどは、ほとんどの時間で必要とされていないので、スレッドプール内にある必要はありません。

この場合、私はSchedulers.newThread()を使うべきだと思います。そうですか?

+0

は、右の私にね。 'Schedulers.io()'は無制限のスレッドプールです。つまり、一度にたくさん実行すると、多くのスレッドをプールに追加することになります。もしそれがあなたが望むものでなければ、 '.newThread()'を使って各スレッドを使い捨てにすることができます。おそらくあなたの質問を質問として再現し、答えの部分を答えに移してそれを受け入れるべきです。 –

+0

これがもっと良いかどうかはまだ疑問です。 'Schedulers.io()'を使って 'Schedulers.shutdown()'を呼び出すと、シャットダウンメソッドはキャッシュされたスレッドを消去しますか?それとも他の問題を引き起こしますか? – otal

答えて

0

あなたが並列にIO仕事を制限したい場合は、カスタムScheduler使用:

Scheduler scheduler = Schedulers.from(Executors.newFixedThreadPool(6));

+0

ありがとうございます。短い時間で再利用できるので、スレッドがすぐに生きるときには良い選択かもしれません。しかし、何千ものスレッドが必要な場合、未使用のスレッドが残っているのと同じ問題があります。 – otal