代わりに、チャンクを読み込んだ後、各チャンクをスレッドプールからワーカースレッドに渡す単一のリーダーを用意するのがよい方法です。これらがデータベースに挿入されることを考えれば、挿入物は入力を読むことと比較して遅い部分であり、読み取りのためには単一のスレッドで十分である。
以下は、System.in
からワーカースレッドまで各行の処理を引き渡す例です。 1つのトランザクション内で多数の挿入を実行すると、1000行のグループを渡すほうが、この例のように1行を渡すよりも優れているはずです。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
public static class Worker implements Runnable {
private final String line;
public Worker(String line) {
this.line = line;
}
@Override
public void run() {
// Process line here.
System.out.println("Processing line: " + line);
}
}
public static void main(String[] args) throws IOException {
// Create worker thread pool.
ExecutorService service = Executors.newFixedThreadPool(4);
BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
String line;
// Read each line and hand it off to a worker thread for processing.
while ((line = buffer.readLine()) != null) {
service.execute(new Worker(line));
}
}
}
こんにちはEdは感謝しています^。^ 1000行をStringBufferに読み込んでこれをワーカースレッドに渡して処理し、データベースに挿入/更新すると良いアプローチになると思いますか? :) –
1000行を 'List'や 'String []'に読み込むのが最善でしょう。 'StringBuffer'にそれらを読み込むと、それは単一の文字列になり、個々の行をもう一度解析する必要があります。 –