2

私は、複数のスレッド(接続されたユーザーごとに1つのスレッド+いくつかの追加のスレッド)を持つJavaベースのサーバーで作業しています。データベース接続が必要になるため、サーバーがデータベースに対してSELECTクエリを実行するたびに、現在のスレッドからのブロックを防ぐために、このための新しいスレッドが開始されると考えていました。私はこれに接続プールを使用することを計画しており、その方法を知っていると思います。(C3P0を調べました)ただし、多くのUPDATEステートメントも含まれますが、これらが直接実行されることは重要ではありません。ここで遅延しても問題ありません。また、 UPDATEステートメントが多数ある可能性があるため、すべてのUPDATEに対して単一のワーカースレッドを使用することを考えています。ステートメント。PreparedStatement私が見ているように、これにはオブジェクトを再利用できるという利点があります

質問: 他のスレッドから、UPDATE -workerスレッドにいくつかのステートメントを実行するように指示するにはどうすればよいですか?マルチスレッドと、同期ブロックを使用してスレッドを相互に「通信」させる方法については知っていますが、データベースが関係していると、突然複雑になります。プリペアドステートメントと接続はスレッド間で共有されるべきではないことを読みました。

それを解決する方法について私が今持っているアイデア:(良い解決策のようには感じません)

LinkedBlockingQueueカスタムクラスの(または別の種類のキュー)を使用して、呼び出すUPDATEステートメントの種類と送信するパラメーターに関する情報を指定します。そして、ワーカースレッドは通知されたときにこのキューから読み取り(キューに何かが追加されたときになります)、そこで適切なプリペアドステートメントを使用する適切なメソッドを実行し、パラメーターを設定して呼び出します。

編集:私がこのアプローチで自分自身を見ているのは悪い考えです。パラメータはints、String、doubleなどである可能性があります。それらをカスタムクラスに保存する方法は?それらをすべてStringとして保存するのは気分が悪いです。

私はここで正しい方向に進んでいますか、それともこれを解決するためのより良い方法がありますか?

4

1 に答える 1

3

明示的なブロッキング キューは必要ありません。によってカプセル化されたワーカー スレッドとワーク キューを持つことができますExecutorService。値については、ジェネリックを使用できます。

class ThreadTask<T> implements Runnable {
    private T value;

    public ThreadTask(T value) {
        this.value = value;
    }

    public void run() {
        // update based on value
    }
}

...

ExecutorService exec = Executors.newSingleThreadExecutor();
exec.submit(new ThreadTask<String>("asdf"));
exec.submit(new ThreadTask<Integer>(1));

シングル スレッド エグゼキューターは、キューで待機し、送信されたタスクを順番に実行する単純なワーカー スレッドです。他の明示的な管理は必要ありません。

于 2012-10-30T19:20:47.440 に答える