4

EJBを正しく理解していれば、@Singletonは実際にはプレーンJavaのシングルトンと同じであり、春のシングルトンでもあります-> 1つのインスタンスで、すべての呼び出しが同時に同じインスタンスを通過します。@Stateless は、複数のインスタンスを持つことができる (ただし、すべきではない) Bean を宣言しますが、同時に 1 つのインスタンスに含めることができる呼び出しは 1 つだけであるという制限があります。右ソファ?これは、サーブレット プログラミング モデルに関する私にとどまります。理論的には、サーブレット コンテナーはサーブレットの複数のコピーを作成することが許可されていますが、実際には、サーブレット コンテナーでそれを行うのを見たことがありません。したがって、コードにドア、窓、プリンターなどの非常に限られたリソースがないと仮定すると (もしそうなら、キューなどで解決できます)、 @Stateless の使用が@シングルトン。

よろしくレオン

4

2 に答える 2

1

スループットを向上させるために、ステートレス Bean のインスタンスを複数持つことができます。

一方、シングルトンのインスタンスは 1 つだけです。これの理由は、通常、アプリケーション スコープで状態を共有し、リソースへのアクセスをシリアル化することなどです。これは、ロックまたは同期を意味します。

したがって、実際にシングルトンがない場合は、ステートレス Bean を使用してください。

「ステートレス シングルトン」がある場合、違いはありません。しかし、「シングルトン」と読むと、慣例により特別な意味を持ちます (= シングルトン パターンを使用する理由があるに違いありません)。

于 2013-06-14T19:51:17.713 に答える
0

ステートレスは、Bean がスレッドセーフであることを意味します。これは、Bean に状態に依存するコードがないためです。これは、そのメソッドのいずれかを実行しても、そのメソッドの将来の実行には影響しないことを意味します。

ステートレス クラスの例は、加算と減算を行うクラスです。必要なすべてのパラメーターがメソッドに渡されます。足し算や引き算を行っても、これらのメソッドがその後の呼び出しで機能する方法は変わりません。これは、クラスとの並行性について心配する必要がないことを意味します。

通常、シングルトンは、データベース接続など、作成に非常にコストがかかるクラスに使用されます。すべてのクラスがデータベースを使用する必要があるたびに新しいデータベース接続を作成するのは望ましくないため、プログラムの起動時に一度インスタンス化します。シングルトンであることは、クラスがスレッドセーフであることを必ずしも意味しません (絶対にスレッドセーフであるべきですが)。

したがって、ステートレスとは、クラスがスレッドセーフであることを意味します。

シングルトンとは、クラスが一度だけ作成されるという事実を指します。これは、クラスがスレッドセーフであることを強く示唆していますが (かつ、そうあるべきです)、ステートレスのようにそれを直接的に示唆しているわけではありません。

于 2013-06-14T19:16:19.550 に答える