使用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。
我不知道在哪里可以搜索解决方案。
答案 0 :(得分:2)
在这些情况下可能会出现此问题:
如果你有一个命令行客户端,你的SFSB工作正常。当命令行应用程序终止时,也会删除SFSB。
例如,如果JSP / servlet使用SFSB,那么当HTTP请求完成时,它的生命周期结束。如果要在HTTP请求中存活,则必须将其句柄放在HTTP会话中:从JNDI查找获得实例后,应将该实例作为属性放在HttpSession
中。使用此SFSB的下一个HTTP请求必须从HttpSession
获取句柄。
来自EJB 3.1, 4.6 Stateful Session Bean State Diagram
的引用通过显式查找或以其他方式获取有状态会话bean时 JNDI查找机制,容器必须提供新的有状态会话bean实例,如 Java EE规范要求(“Java命名和目录接口(JNDI)”一节) 命名上下文“[12])。
所以你不应该多次查找SFSB。