0

これは何百万回も尋ねられていることは知っていますが、これまでのところ、頭の中で質問に答えていません。コードで理解するのが最善だと思います。誰かが私の考えを確認してください:

クライアントのステートレス Bean:

public void work(){
    bean.work1();   <--- this uses instance 1 in App Server
    ...
    bean.work2();   <--- this can be instance 2 in App Server
}

クライアントのステートフル Bean:

public void work(){
    bean.add_item(item); <------- this uses instance 1 in App Server
    ....
    bean.checkout();     <------- this uses instance 1 in App Server
}

セッションを破棄するには:

public void work(){
    ...
    bean = null;
}

オラクルのドキュメントから

その名前が示すように、セッション Bean はインタラクティブ セッションに似ています。セッション Bean は共有されません。インタラクティブ セッションが 1 人のユーザーしか持てないのと同じように、クライアントは 1 つしか持てません。クライアントが終了すると、そのセッション Bean は終了したように見え、クライアントに関連付けられなくなります。

状態は、クライアント/Bean セッションの間保持されます。クライアントが Bean を削除すると、セッションが終了し、状態が消えます。ただし、この状態の一時的な性質は問題ではありません。クライアントと Bean の間の会話が終了すると、状態を保持する必要がないためです。

上記が正しければ、これから派生する私の質問は、Bean 参照が null に設定されている場合、App サーバーはステートフル Bean インスタンスを破棄して新しいインスタンスを作成しますか? これは次の理由によるものです。

  1. メソッドを実装しない限り、bean にアイテムを追加し、新しいクライアントの bean にとどまりますflushが、それは正しい方法ではないと思います。
  2. ベスト プラクティスとして、Bean が独自の状態を変更してはならない、つまりthis.itemsBean 内に項目を追加してはならない場合、Stateful Bean を使用するより良い理由を思いつきませんか?
  3. 「状態」はBeanインスタンス自体を意味しますか?
4

1 に答える 1

0

ステートレス/ステートフル セッション Bean に使用できる Bean インスタンスの分析は正しいです。

フィールドを null に設定しても、実際には何も起こりません。ステートフル セッション Bean を破棄するには、remove メソッドを呼び出す必要があります (EJB 3 を使用している場合は、注釈付きのメソッドを呼び出すことを意味します@Remove)。

  1. ステートレス セッション Bean を参照している場合は、Bean に状態を保存しないでください。ステートフル セッション Bean を参照している場合は、flush メソッドが妥当と思われます。または、ロジックをメソッドに入れることもできます@Remove(おそらく、flush という名前です)。

  2. 状態の変更は問題ありません。状態を維持することがステートフル セッション Bean の目的であることは間違いありません。

  3. はい。ただし、クライアントとの関連付けも意味します。ステートレス セッション Bean はメンバー変数に状態を明確に格納できますが、クライアントが同じインスタンスを取得することが保証されていないため、EJB (インスタンスではない) には実際の状態はありません。これは、ステートレス セッション Bean がクライアントの状態をメンバ変数に格納してはならないことも意味します。実際には使用されないためです。

于 2016-02-25T14:51:40.267 に答える