本人用EJB不多,只知道stateful session bean可以记录调用者信息,可以和调用者一对一;stateless session bean不可以,那我的疑问是,如果客户端cache住stateless session bean的存根(只lookup一次)那后面多次对bean的方法进行调用,难道不能保证调用到同一个bean的实例?

解决方案 »

  1.   

    个人理解是这样的:stateless session bean不能被钝化,所以即使客户端cache了存根,如果长时间不调用,bean的实例可能会被容器删除,当客户端再次调用cache了的存根方法时,容器会创建一个新的bean实例并调用上面的方法,所以其状态是不被保证的,不像stateful session bean,不知理解的对否?
      

  2.   

    不是吧,没人回,EJB高手给点指点撒?满意给分。
      

  3.   

    晕死,打了好长时间的字,一不小心点了个超链接没有了!Stateless Bean 在提供完一次服务之后,并不会马上被 EJB 容器回收掉,而是存放于所谓的实例池中,以备下次服务调用。Stateless Session Bean 一般仅写一些没有成员变量,或者成员变量并非状态的类,如果写了带有状态成员变量的 Stateless Session Bean 很可能会发生这种情况:某一调用请求 A 在调用时将这个 Bean 中的成员变量值更改了,在 A 调用完成后,容器将这个 Bean 缓存在实例池中,当另一请求 B 在请求调用时,EJB 容器先从实例池中寻找这个 Bean,如果找到的话请拿出来使用,如果 A 之前调用的那个 Bean 还未被回收,这时 B 取出来的这个 Bean 就是 A 之前使用过的 Bean,这时这个 Bean 实例中的那个成员变量并不是初始值,而是被 A 更改后的值。Stateless Session Bean 一般仅写一些没有成员变量,或者成员变量并非状态的类,比如 DAO 之类的,如果 Bean 含 有某状态的成员变量时,就应该使用 Stateful 的 Bean。
      

  4.   


    至于 Stateless Session Bean 在为某一客户端提供完服务之后,是缓存于实例池中,还是马上被回收,抑或是暂时存放在实例池中,EJB 规范并没有强行规律,具体的由 EJB 容器厂商决定。不过大多数的 EJB 容器有个实例池的概念,不过这个实例池的大小是有限的,并不是无限止能放对象进去的。
      

  5.   

    这样讲对不对:
    对于stateless session bean,当客户端调用存根方法时,由容器决定分配哪个实例bean来服务;
    而对于stateful session bean,一定是由与存根相对应的那个实例bean来服务?
      

  6.   

    我想应该是这样的,stateless bean有实例池,stateful bean也有实例池,只不过调用一个不需要恢复状态,一个要恢复用户的状态
      

  7.   

    stateful session bean 可以缓存,被再次使用,保证1对1, stateless session bean 你缓存是没有意义的,调用时都是一个bean,它没有状态,使用原来的和新的没有区别.明白没?