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/servlet 使用,它的生命周期在 HTTP 请求完成时结束。如果要在 HTTP 请求中存活,您必须将其句柄放在 HTTP 会话中:从 JNDI 查找中获得实例后,您应该将该实例作为属性放在HttpSession. 使用此 SFSB 的下一个 HTTP 请求必须从HttpSession.

  • 每个 JNDI 查找都返回一个新实例

引自EJB 3.1、4.6 Stateful Session Bean State Diagram

当通过显式 JNDI 查找机制查找或以其他方式获取有状态会话 bean 时,容器必须按照 Java EE 规范(“Java 命名和目录接口 (JNDI) 命名上下文”部分)的要求提供新的有状态会话 bean 实例[12])。

因此,您不应多次查找 SFSB。

于 2013-08-03T19:40:21.483 回答