これは何百万回も尋ねられていることは知っていますが、これまでのところ、頭の中で質問に答えていません。コードで理解するのが最善だと思います。誰かが私の考えを確認してください:
クライアントのステートレス 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 インスタンスを破棄して新しいインスタンスを作成しますか? これは次の理由によるものです。
- メソッドを実装しない限り、bean にアイテムを追加し、新しいクライアントの bean にとどまります
flush
が、それは正しい方法ではないと思います。 - ベスト プラクティスとして、Bean が独自の状態を変更してはならない、つまり
this.items
Bean 内に項目を追加してはならない場合、Stateful Bean を使用するより良い理由を思いつきませんか? - 「状態」はBeanインスタンス自体を意味しますか?