当前位置: 技术问答>java相关
求教,Stateless session Bean会自动保存状态?
来源: 互联网 发布时间:2015-04-09
本文导语: 我用JBuilder编了一个Stateless SessionBean,部分代码如下: public int oTimeout = 0; public void setTimeouts(int iTimeout){ this.oTimeout += iTimeout; } public int getTimeouts(){ return this.oTimeout; } 测试程序如...
我用JBuilder编了一个Stateless SessionBean,部分代码如下:
public int oTimeout = 0;
public void setTimeouts(int iTimeout){
this.oTimeout += iTimeout;
}
public int getTimeouts(){
return this.oTimeout;
}
测试程序如下:
Object ref = ctx.lookup("Project2");
project2Home = (Project2Home) PortableRemoteObject.narrow(ref, Project2Home.class);
project2Remote = project2Home.create();
project2Remote.setTimeouts(200);
project2Remote.setTimeouts(300);
System.out.println(project2Remote.getTimeouts());
执行结果,第一次是500,第二次是1000!请问,如果要第二次也是500怎么做?
public int oTimeout = 0;
public void setTimeouts(int iTimeout){
this.oTimeout += iTimeout;
}
public int getTimeouts(){
return this.oTimeout;
}
测试程序如下:
Object ref = ctx.lookup("Project2");
project2Home = (Project2Home) PortableRemoteObject.narrow(ref, Project2Home.class);
project2Remote = project2Home.create();
project2Remote.setTimeouts(200);
project2Remote.setTimeouts(300);
System.out.println(project2Remote.getTimeouts());
执行结果,第一次是500,第二次是1000!请问,如果要第二次也是500怎么做?
|
什么是stateless?我认为就是bean developer和别的什么人(系统)有这么一个约定:我的bean里没有保存状态,系统可以据此作任何优化(如:生存期控制,多线程等等。记住实际上ejb container是从你的bean继承了一个类来生成对象的,同时加入了一些系统调用的方法)。
也就是说,系统看到这是一个stateless的bean,所以会按管理此类的bean的方法管理你这个对象,他也许会根据这个对象的使用频率决定生成多少个这样的对象,当一个对象使用完后并没有删除而是分配给别的用户使用,所以如果你在对象中存放了状态,系统不知道(因为你告诉他这是个stateless的)。但是如果你想利用这个特性,那你就错了,应为系统分配给你的对象,也许是另外一个,而不是你想要的。
好了,我想我说的挺清楚的:) 再看看书吧
也就是说,系统看到这是一个stateless的bean,所以会按管理此类的bean的方法管理你这个对象,他也许会根据这个对象的使用频率决定生成多少个这样的对象,当一个对象使用完后并没有删除而是分配给别的用户使用,所以如果你在对象中存放了状态,系统不知道(因为你告诉他这是个stateless的)。但是如果你想利用这个特性,那你就错了,应为系统分配给你的对象,也许是另外一个,而不是你想要的。
好了,我想我说的挺清楚的:) 再看看书吧
|
你说的这种情况是这样产生的:
当你第一次调用你的Stateless Session Bean,AppServer产生了这个Bean并在你调用后放入缓冲池了,这个Bean的Context中保持了有关这个Bean的环境变量信息(而不是Bean内部的数据);当你第二次调用的时候,AppServer从缓冲池中再把这个Bean激活(因为我想这时除了你,不会有别人在调用它了吧),所以你会发现它保存了上次的状态。你可以试试第三次调用的时候是否为1500。所以如果你应该在每次调用的时候清空你所要设置的状态。
当你第一次调用你的Stateless Session Bean,AppServer产生了这个Bean并在你调用后放入缓冲池了,这个Bean的Context中保持了有关这个Bean的环境变量信息(而不是Bean内部的数据);当你第二次调用的时候,AppServer从缓冲池中再把这个Bean激活(因为我想这时除了你,不会有别人在调用它了吧),所以你会发现它保存了上次的状态。你可以试试第三次调用的时候是否为1500。所以如果你应该在每次调用的时候清空你所要设置的状态。
|
当然嘛,因为是Statless的,APPServer认为完全没有必要真正去把它给Remove掉,只会将这个Bean放入Cache中等待下一个请求的到来
|
里面什么代码都没有为什么会奇怪?因为这个ejb对象不是由你创建的,而是由ejb container创建的。ejb container针对你的这个bean生成了外围代码,一些具体的工作由ejb container完成了。
再想一下CMP 的entity bean,你的find方法什么也不需要写,可你照样可以找到你所要的entity bean,why?因为所有的工作由ejb container完成了。
再想一下CMP 的entity bean,你的find方法什么也不需要写,可你照样可以找到你所要的entity bean,why?因为所有的工作由ejb container完成了。