5

ユーザーからの特定のリクエストを完了するために、私のアプリケーションでは、単一のメソッドから複数の DB クエリを発行していますが、それらは現在順次実行されているため、アプリケーションは前のクエリの応答/データを受信するまでブロックされます、次のクエリに進みます。これは私があまり好きではありません。並列クエリを発行したいと思います。

また、クエリを発行した後、(以前のクエリの応答までブロックされるのではなく) 他の作業を行いたいと思います & 各クエリの応答を取得する際に、各クエリのデータに固有のコード ブロックを実行したいと思います。これを行う方法は何ですか?

編集:My DB API は接続プーリングを提供します。


私はJavaマルチスレッドに少し慣れています。

Using:-
------
Java 1.6
Cassandra 1.1 Database with Hector
4

3 に答える 3

0

同様のタスク/問題があります。完全なビルド結果を得るには、いくつかの異なるサービス (REST ではいくつか、Thrift ではいくつか) に対していくつかのリクエストを送信する必要があります。遅延を減らすために、並行して送信する必要があります。私の考えは、 java.util.concurrent.Future を使用して、単純な集計マネージャーを作成することです。これにより、多くのリクエストがまとめて作成され、最後に取得された応答が待機され、必要なすべてのデータが返されます。より高度なソリューションでは、このマネージャーは他のクエリ中に最終結果を作成/結合できますが、このソリューションはスレッドセーフではありません。

于 2012-04-24T14:22:34.570 に答える
0

これを始める前に理解する必要があります

  1. 同時実行のメリットを得るには、複数のデータベース接続が必要です。これを解決する最善の方法は、db プールを作成することです。

  2. db ステートメントを実行するには、実行可能/呼び出し可能なクラスを作成する必要があります。クエリが完了したときにリスナーに警告するために、いくつかのメッセージング システムをまとめる必要があります。

  3. 同時に複数のリクエストを送信している場合、どれが最初に完了するかについてすべての賭けがオフになり、アプリを不安定にするステートメント間の競合が発生する可能性があることを理解してください。

于 2012-03-29T20:16:49.273 に答える
-3

これは非常に些細な/限定的なアプローチです:

final Connection conn = ...;
final Object[] result = new Object[1];
Thread t1 = new Thread(new Runnable() {
    public void run() {
        Object results = conn.executeQuery();
        result[0] = results;
    }
});
t1.setName("DBQueryWorker");
t1.start();
// do other work
while (t1.isAlive()) {
   // wait on thread one
}

これは単純なアプローチですが、他にも多くの方法が可能です (たとえば、Java Concurrency タスク エグゼキューター、Spring タスク エグゼキューターによるスレッド プーリングなど)。

于 2012-03-29T20:12:03.693 に答える