1

JavaEEWebアプリケーションがあります。特定のリクエストが来たら(たとえば/ xyz url patter)、次のように複雑な処理を行いたいと思います

次の3つのステップはそれぞれ非常に複雑で、時間がかかります。

  1. DBから1つのテーブルからデータを取得します。テーブルには膨大なデータがあり、クエリには時間がかかります。
  2. 他のWebサービスAにWebサービス呼び出しを行い、そのデータを取得します。
  3. 他のWebサービスBに別のWebサービス呼び出しを行い、そのデータを取得します。
  4. 1、2、3の出力を使用していくつかの処理を行います

1、2、および3は互いに独立しているため、並行して呼び出すことができます。

今の質問は次のとおりです。

  1. 3つの別々のスレッドで操作1、2、および3を実行できますか?
  2. リクエストごとに3つのスレッドを作成することをお勧めしますか?
  3. スレッドプールを使用する必要がありますか?
4

2 に答える 2

1

最初の質問に答えるために、私は4つのステップを実行します。

  1. はい、使用しているデータベースドライバーが同時アクセスを許可している場合は、それぞれ異なるスレッドから安全に使用できます。
  2. Webサービスは通常、異なるリクエストを同時に処理するように設計されているため、これも機能するはずです。ここでの問題は、使用するスレッドの数(および1つのリクエストの処理にかかる時間)と、Webサービスが処理するかどうかです。一度に多くのリクエストから身を守ります。
  3. ここでも同じことが言えます。
  4. はい。ただし、次のように、ここで同期を行う必要があります。すべてのスレッドが結果を受け取るまで待ちます。これは、 java.util.concurrent.CyclicBarrierで実現できます。

2番目の質問 データ、特にWebサービスが応答する速度によって異なりますが、試してみる必要があります。

3番目の質問間違いなく、それが彼らの目的です。これは、アプリケーションの構造化にも役立ちます。

于 2012-07-18T18:14:38.570 に答える
1

1)3つの別々のスレッドで操作1、2、および3を実行できますか?はい、できます。

2)リクエストごとに3つのスレッドを作成することをお勧めしますか?これらが相互に依存しない限り、また同じトランザクションでこれらを取得することに依存しない限り、問題はないように思われます。もちろん、1つ以上のスレッドが成功しない場合に対処する必要があります。スレッドに時間がかかりすぎたり、失敗して戻ってきた場合にスレッドをキャンセルするには、別のウォッチドッグスレッドが必要になります。

3)スレッドプールを使用する必要がありますか?他に何をするかに関係なく、スレッドを使用するときは常にプールを使用する必要があります。そうすれば、スレッドが完了しない、悪い状態になる、またはその他の方法で使用できなくなるという問題が発生した場合に、アプリケーションをスレッドの不足から保護できます。

于 2012-07-18T18:15:18.413 に答える