7

spring と hibernate と struts を使用する Web アプリケーションがあります (Tomcat で実行されます)。

呼び出しシーケンスは次のようなものです...

Struts アクションは、Spring サービス Bean を呼び出し、Spring DAO Bean を呼び出します。DAO 実装は Hibernate 実装です。

問題は 、すべての春の Bean が同じスレッドで実行されるかどうかです。ThreadLocal に何かを保存して、別の Bean で取得できますか?

これは Stateless Session Bean では機能しないと確信しています。EJB コンテナは、セッション Bean への呼び出しごとに新しいスレッドを生成できます (または生成します)。

春のコンテナは同じことをしますか?つまり、すべての Bean を同じスレッドで実行しますか?

JUnit テストを試したとき、テスト ケースと 2 つの Bean で Thread.currentThread().getId() を介して同じ ID を取得しました。

それとも挙動が予測不能?または、Tomcat サーバーで実行すると変更されますか?

明確化 2 つのスレッド間でデータを交換したくありません。データを ThreadLocal に入れ、コール スタック内のすべての Bean からデータを取得できるようにしたいと考えています。これは、すべての Bean が同じスレッドにある場合にのみ機能します

4

4 に答える 4

16

Springはスレッドを生成しません。Tomcatはそうします。Springは、オブジェクトを作成して配線するだけです。

ブラウザからの各リクエストは、1つのリクエストで処理されます。リクエストを処理するのはTomcatです。リクエストを処理するスレッドを作成するのはTomcatです。

Springで「X」と呼ばれるシングルトンBeanを作成したと仮定します。次に、Xの同じインスタンスがすべてのリクエストで使用されます。

春の豆はスレッドに住んでいません。それらはヒープに割り当てられるだけです。

于 2009-04-23T16:29:20.053 に答える
1

すべてのSpringBeanは同じスレッドで実行されますか?ThreadLocalに何かを保存して、別のBeanに取り込むことはできますか?あなたが言及したコンポーネント(サービスBean、DAOBean-プレーンなSpringBeanだと思います)については、Springは新しいスレッドを生成しません。私はあなたのユースケースを理解していません(つまり、2つのスレッド間でデータを交換します)。

ほとんどのWebアプリでは、新しいリクエストごとに新しいスレッドが生成されます。2つのリクエスト間でデータを共有する場合は、通常、次のようにします。-get/postパラメーターを使用してデータを渡します-セッションを使用してデータを共有します

あなたの質問に答えるために、私はスプリングコンテナがほとんどのコンポーネントのスレッドを生成しないと確信しています。

于 2009-04-23T16:33:11.417 に答える
0

はい、できます。同じスレッドがアクションの実行に使用されるため、ThreadLocal が機能します。通常、ステートレス セッション Bean にも同じスレッドが使用され、同じアプリ サーバー インスタンスで実行されていると想定されます。ただし、おそらくベンダーに依存するため、これには依存しません。

この手法を使用して、コード内の任意の場所で呼び出し元の ID にアクセスします。セッション Bean と jms も使用しますが、コンテナー間で情報を明示的に渡し、各エントリ ポイントで ThreadLocal を設定します。この方法では、Bean (セッションまたは mdb) がローカルかどうかは問題ではありません。

于 2009-04-23T17:27:34.780 に答える
0

他のすべての回答に加えて、次を追加します。

通常、スレッドを切り替える唯一の理由は、並列性に対する何らかの要件のためです。これは通常、複雑さの点で無料で提供されるわけではないため、通常、これが発生したときに明確に通知されます。

リクエストのシングルスレッド処理のように見えるスレッドの切り替えは、実際には非常に複雑です。これは通常、コンテナー内の 1 か所でのみ発生し、通常、外部クライアントからの要求を受信する tcp/ip ソケット リーダーによって処理されます。これらのリーダー スレッドは通常、どのスレッド (プール) が要求を処理し、要求をそのスレッドに転送するかを決定します。その後、リクエストはそのスレッドに残ります。

したがって、通常、発生する可能性のある唯一のことは、並列処理または非同期処理 (JMS など) のために追加のスレッドが作成されることです。

于 2009-04-24T18:48:23.250 に答える