1

Java EE では、ステートフル セッション Bean を使用する必要があります。

@Stateful
@TransactionManagement(TransactionManagementType.BEAN)
public class FacadeExercice extends AbstractFacade<EntityBeanExercice>
  implements IFacadeExercice {

@PersistenceContext(unitName = "GestionCours-ejbPU")
private EntityManager em;
@Resource
private UserTransaction transaction;
private int lastChange;
private int connections;

[...]

@Override
public EntityBeanExercice find(Object id) {
    EntityBeanExercice ex = null;
    connections += 5;
    try {
        transaction.begin();
        ex = super.find(id);
        lastChange = ex.getLastChange();
        transaction.commit();
    } catch (Exception ex1) {
        Logger.getLogger(FacadeExercice.class.getName()).log(
          Level.SEVERE, null, ex1);
    }
    return ex;
}
}

しかし、Bean を入力するたびに、connections変数は 0 に設定されます。

解決策を検索できる場所がわかりません。

4

1 に答える 1

2

この問題は、次の状況で発生する可能性があります。

  • SFSB の存続期間は、そのクライアントの存続期間に関連しています。

たとえば、コマンドラインクライアントを使用している場合、SFSB は正常に動作します。コマンド ライン アプリケーションが終了すると、SFSB も削除されます。

たとえば、SFSB が JSP/サーブレットによって使用されている場合、HTTP 要求が完了すると、SFSB の有効期間は終了します。HTTP 要求に耐えられるようにする場合は、そのハンドルを HTTP セッションに配置する必要があります。JNDI ルックアップからインスタンスを取得したら、そのインスタンスを属性として に配置する必要がありますHttpSession。この SFSB を使用する次の HTTP 要求は、 からハンドルを取得する必要がありますHttpSession

  • 各 JNDI ルックアップは新しいインスタンスを返します

EJB 3.1、4.6 ステートフル セッション Bean 状態図からの引用

ステートフル セッション Bean がルックアップされるか、明示的な JNDI ルックアップ メカニズムを介して取得される場合、コンテナは Java EE 仕様 (セクション「Java ネーミングおよびディレクトリ インターフェイス (JNDI) ネーミング コンテキスト」 [12])。

したがって、SFSB を複数回ルックアップしないでください。

于 2013-08-03T19:40:21.483 に答える