【问题标题】:Stateful session bean forgets values有状态会话 bean 忘记值
【发布时间】:2013-05-03 12:23:23
【问题描述】:

对于 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。

我不知道在哪里可以搜索解决方案。

【问题讨论】:

    标签: java-ee-6 stateful-session-bean


    【解决方案1】:

    在以下情况下可能会出现此问题:

    • 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的引述

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-02
      • 1970-01-01
      • 2013-11-29
      • 1970-01-01
      相关资源
      最近更新 更多