0

次のことを行うサーブレットがあります。

  1. Web サービスから一連のデータを取得します
  2. ローカル データベースから一連のデータを取得します。
  3. 2 つのセットをマージし、結果を返します。

実際には、サーブレット コード自体の中でこれが行われることはほとんどありませんが、サーブレットは上記のことを行う Java クラスを呼び出します。

ほとんどの時間は Web サービスとデータベースの両方の待機に費やされるため、この 2 つを同時に実行することを検討しています。Web サービス呼び出しをスレッドに入れ、データベースからデータを取得し、Web サービスが完了するまで待ってから続行します。これで問題ないように思えますが、サーブレットからスレッドを起動するのはよくないという話をよく耳にします。この状況がどのように問題につながるのか、私にはわかりません。どんな助けも素晴らしいでしょう(LinuxでTomcat 6を使用しています)。ありがとう!

4

3 に答える 3

1

サーブレット自体からスレッドが開始されるのをよく見かけます。ユースケースは、サーブレット内でスレッドを開始する正当な理由です。

于 2012-05-29T19:26:47.263 に答える
0

リクエストがサーバーに到達するたびに、コンテナはリクエストを処理するための新しいスレッドを割り当てるか作成します。リクエストごとに、service()メソッドが独自のスタックで呼び出されるたびに、service()メソッドはHttpに応じてdoGetまたはdoPostを呼び出します。リクエスト。これで、doGetまたはdoPostの範囲内に限定されたスレッドを使用するのはまったく問題ありません。

于 2012-05-29T19:21:44.893 に答える
0

システムが一度にサポートできるスレッドの数は限られたリソースです。また、スレッドの作成はコストのかかる操作です。そのため、最新のサーブレット コンテナーはすべての要求に対して新しいスレッドを作成するのではなく、スレッドのプールを維持します。プールからのスレッドが着信要求に割り当てられます。すべてのスレッドがビジー状態の場合、要求はキューに入れられるか、新しいスレッドが作成されます (サーブレット コンテナーが使用する戦略によって異なります)。

したがって、スレッドを作成することは (機能的な観点からは) 確かに機能しますが、多くのリクエストが来ると、サーバーが窒息し始めます。サーブレット コンテナーが使用するのと同様の戦略を使用できます。Java は、この種のタスクのフレームワークをすでに提供しています。Executorおよび関連するクラスの javadoc を参照してください 。

于 2012-05-29T19:48:19.233 に答える