30

Java EE 6 チュートリアルには次のように書かれています。

パフォーマンスを向上させるために、ステートレス セッション Bean が次の特性のいずれかを備えている場合は、その Bean を選択できます。

  • Bean の状態には、特定のクライアントのデータがありません。
  • 1 回のメソッド呼び出しで、Bean はすべてのクライアントに対して一般的なタスクを実行します。たとえば、ステートレス セッション Bean を使用して、オンライン注文を確認する電子メールを送信できます。
  • Bean は Web サービスを実装します。

Singleton セッション Bean は、次の状況に適しています。

  • 状態はアプリケーション全体で共有する必要があります。
  • 1 つのエンタープライズ Bean に、複数のスレッドが同時にアクセスする必要があります。
  • アプリケーションには、アプリケーションの起動時およびシャットダウン時にタスクを実行するエンタープライズ Bean が必要です。
  • Bean は Web サービスを実装します。

しかし、次の場合は何を使用しますか:

  • アプリケーション全体で状態を共有する必要はありません
  • 単一のエンタープライズ Bean に複数のスレッドが同時にアクセスできる
  • 起動時または停止時のタスクを実行する必要はありません

たとえば、次のインターフェイスを持つログイン サービスがあるとします。

public interface LoginService {
  boolean authenticate(String user, String password);
}

@Singleton または @Stateless でアノテーションを付ける必要がありますか? 一方と他方の利点は何ですか?LoginService に (同時に使用される) EntityManager を注入する必要がある場合はどうなりますか?

追加:ステートレス シングルトンである Spring サービス Bean の Java EE 版について考えています。Java EE の対応物が @Stateless セッション Bean であり、@Singleton Bean が起動時のアプリケーションの構成またはシャットダウン時のクリーンアップ、またはアプリケーション全体のオブジェクトの保持に使用されることを正しく理解している場合。これは正しいです?

4

8 に答える 8

13

私はステートレスを選びます-サーバーはBeanの多くのインスタンスを生成し、着信要求を並行して処理できます。

シングルトンは潜在的なボトルネックのように聞こえます。デフォルトの@Lock値は@Lock(WRITE)ですが、Beanまたは個々のメソッドでは@Lock(READ)に変更できます。

于 2010-01-06T16:05:17.550 に答える
2

@Statelessを使用すると、JVM 内で複数のコピーを処理できる状態にすることができます (メモリとプールのサイズが許す限り)。ただし、@Singleton の場合、単一のコピーが複数の同時実行スレッドをサポートできる場合でも、JVM には 1 つのコピーしかありません。

@Singleton使用するリソースが長時間のアクセスを許可していれば、パフォーマンスの点でより優れたものになります。ただし、分散環境では、データベースやネットワーク リンクに障害が発生するなど、問題が発生することがあります。

Bean を使用する@Statelessと、アクセスの寿命が短くなります。さらに、障害が発生した場合は、再生成してリソースへの新しい接続を確立しようとします。@PostConstruct は JVM ごとに 1 回しか呼び出されないため、シングルトンでそのようなことが発生した場合、アプリケーションの再起動を必要とせずにシングルトンで処理する必要があります。

特に私が制御できないシステムでは、ほとんどの状況でパフォーマンスよりも少しの耐障害性を好みます。

于 2015-07-27T20:51:51.963 に答える
1

同時使用のシングルトンはSLSBプールよりもパフォーマンスが悪くはないと思いますが、さらに優れている可能性があります。唯一の問題は、スレッド間で何かを共有したい場合、それをロックする必要があり、それがパフォーマンスの大きな問題になる可能性があることです。その場合、SLSB プールは 100% シングルトンではなく、より多くのインスタンスがあり、1 つがロックされ、もう 1 つが起動するため、パフォーマンスが大幅に向上します。とにかく、ロックがすべての SLSB によって共有されているリソースにある場合、プールはどちらにも役立ちません。

要するに、singleton は SLSB Pool よりも優れていると思います。可能であれば使用する必要があります。これは、Spring Bean のデフォルトのスコープでもあります。

私は JavaEE の専門家ではありません。これは単なる私の感覚です。間違っている場合は訂正してください。

于 2012-01-03T15:26:55.880 に答える
0

アプリケーション全体で一定のままになるリソースがある場合は、Singleton を使用する必要があります。アプリケーションのライフサイクル全体で変更されないファイルまたは参照データからデータをロードするようなものです。それ以外の場合は、SLSB を選択してください。SLSB の欠点は、複数のオブジェクトが作成されるため、より多くのメモリが占​​有されることです。

于 2014-06-23T18:28:14.210 に答える