无状态会话bean不记录连接状态,较省资源,默认为此,一般如此;有状态会话bean会记录每一个jndi连接,较费资源,很少用.如果你不是有知道连接人的身份,用无状态的好了.

解决方案 »

  1.   

    那么记录jndi连接有什么意义?
      

  2.   

    现在讨论ejb2.0有什么意义?都废弃的东西。用ejb2.0做过项目,效率奇低。
      

  3.   

    无状态的Session bean,不会把成员变量持久化。 这些成员变量会被多个客户端所共用。
        所以,使用stateless Session Bean时,不应该使用成员变量。
    而Stateful session bean ,会把成员变量持久化。 这样多个客户端使用同一个Stateful Session Bean时,实例变量是相互独立的。
      

  4.   

    to shendl:
      成员变量持久化是怎么回事?我访问一个无状态的会话bean,设置了一下它的成员变量值,又在另一个类再次访问这个bean,读取的成员变量值并没有前一个设置上的值,怎么能说它的成员变量会被多个客户端所共享呢。
      

  5.   

    to ltshark:
      不用2用3吗?现在还没有3的书啊
      

  6.   

    良少说的没错的,LZ
    to shendl:
      成员变量持久化是怎么回事?我访问一个无状态的会话bean,设置了一下它的成员变量值,又在另一个类再次访问这个bean,读取的成员变量值并没有前一个设置上的值,怎么能说它的成员变量会被多个客户端所共享呢。
    ------------------------------------
    你的例子肯定有问题,SLSB的变量将被所有客户端共享,而SFSB的变量将针对各个客端保持不同的变量,我以EJB3举个例子(EJB2.X原理一样):接口:
    public interface Calculator{
       int getI();
       void setI(int i);
    }
    实现的SLSB(无状态session bean,采用EJB3的标注):
    import javax.ejb.Stateless;
    import javax.ejb.Remote;
    @Stateless   //注释为无状态
    @Remote(Calculator.class)  //注释为远程接口
    public class CalculatorBean implements Calculator
    {
         private int i=0;  //成员变量,无状态session bean将为客户端共享
         //getter,setter方法,实现接口 
         public void setI(int i){
       this.i=i;
         }
          public int getI(){
       return this.i;
         }
    }
    然后,写两个客户端,代码都一样,其中一个设置i为20,另外一个访问i并打印:
    public class CalculatorClient2 {         public static void main(String[] args) throws Exception
    {
      InitialContext ctx = new InitialContext();
          Calculator cb = (Calculator) ctx.lookup("CalculatorBean/remote");
               cb.setI(20);  //设置i为20
               System.out.println(cb.getI());
    }}
    打印:20
    另一个直接访问:
    public class CalculatorClient { /**
     * @param args
     */
     public static void main(String[] args) throws Exception
       {
      InitialContext ctx = new InitialContext();
          Calculator cb = (Calculator) ctx.lookup("CalculatorBean/remote");
             System.out.println(cb.getI());
    }}
    也打印:20
    由此可见,i在各个客户端间是共享的.如果你把上面的例子中的@Stateless改为@Statefull,也就是改成有状态session bean,那么
    CalculatorClient2将打印:20
    而CalculatorClient打印:0
    SFSB针对不同的客户端维护不同的i变量SLSB与SFSB的主要区别:
    1 无状态 (Stateless) 
    在不同方法调用间不保留任何状态 
    事务处理必须在一个方法中结束 
    通常资源占用较少;可以被共享(因为它是无状态的)
    2 有状态 (Stateful) 
    可以在不同的方法调用间保持针对各个客户端的状态 
    与客户端的联系必需被维持;通常开销较大 
      

  7.   

    可能是我那天的程序设置成stateful了,因此看不到。