无状态会话ejb object的个人理解

04-09-27 wwlhp@jdon
每次访问都要创建一个新的ejb对象,不用了就把这个ejb对象删除。既然这个ejb对象没有任何用户会话相关的状态,容器为什么不去重用呢。
当然可以用home对象多建立一些ejb对象,在web层维护一个ejb对象的stub池。访问ejb时就从池中取出一个stub,调用业务方法,用完了就把这个stub返回池中。但不知道这样做值不值得,能提高多少性能。请高手们指点。

huzhigang
2004-09-28 08:36
容器对无状态回话bean是以实例池的形式来提供对多用户使用。并不会像你说的这样做。
任何一个SLSB一旦服务完一个客户,经常表现为完成一个SLSB方法后,该实例就可以立即来服务另一个客户。不会导致SLSB的删除。
SLSB的删除会发生在几种情况,比如:出现系统级的异常,容器发现实例池不必要的过大,等。

SportsBaby1980
2004-09-28 09:44
你讲的:
当然可以用home对象多建立一些ejb对象,在web层维护一个ejb对象的stub池。访问ejb时就从池中取出一个stub,调用业务方法,用完了就把这个stub返回池中。但不知道这样做值不值得,能提高多少性能。请高手们指点。

如果是你做的话,当然不值得,因为你使用的Application Server已经完成了。再做一次?

wwlhp@jdon
2004-09-28 10:45
>如果是你做的话,当然不值得,因为你使用的Application Server已经完成了。再做一次?

不明白,能说清楚点么?

SportsBaby1980
2004-09-28 14:50
不知道你了解
EJB的生命周期否?

StateLess SB
EJB是存在EJB POOL中(EJB pool在EJB container中)

SLSB:因为是无状态,所以,对于任何一个客户端来讲
都是一样的,也就是说,一个SLSB 在服务完一个客户端后,
再向其他客户端服务,是不会有任何影响,因为不存在状态的问题
这样的话,SLSB 在服务完后,可以继续对其他客户服务,
而不是销毁掉。

这同DataSource是类似的,
取一个Connection,使用完毕后,放到 Connection pool中,
并不关闭,如果再有要求,可继续使用。


最好找本书,仔细的研究一下。
再动手做。

wwlhp@jdon
2004-09-29 09:18
无状态session bean实例的池调度我是清楚的。我不明白的是ejb object,也就是容器实现的远程接口的实现类,这个类的实例叫做ejb对象。
每次你在home stub上调用create()方法,容器就会创建一个ejb对象,然后从池中挑出一个bean实例与这个ejb对象关联,然后把ejb对象的stub返回给你,你用完了之后就在这个remote stub上调用remove()方法,容器就会销毁这个ejb对象。
我不清楚的是这个ejb对象,难道容器不能重用他们么?

SportsBaby1980
2004-09-29 14:21
我写了一点代码,主要是用来测试SLSB的是不是在remove后就销毁,

************start time**********************Wed Sep 29 14:14:48 CST 2004

**************end time********************Wed Sep 29 14:14:54 CST 2004

这是命令行的结果。

14:13:52,640 INFO [STDOUT] **************doAnything now************i==49
14:14:52,906 INFO [STDOUT] **************doAnything now************i==0
14:14:52,984 INFO [STDOUT] **************doAnything now************i==1
14:14:53,031 INFO [STDOUT] **************doAnything now************i==2
14:14:53,078 INFO [STDOUT] **************doAnything now************i==3
14:14:53,109 INFO [STDOUT] **************doAnything now************i==4
14:14:53,171 INFO [STDOUT] **************doAnything now************i==5
14:14:53,218 INFO [STDOUT] **************doAnything now************i==6
14:14:53,265 INFO [STDOUT] **************doAnything now************i==7
14:14:53,328 INFO [STDOUT] **************doAnything now************i==8
14:14:53,375 INFO [STDOUT] **************doAnything now************i==9
14:14:53,421 INFO [STDOUT] **************doAnything now************i==10
14:14:53,484 INFO [STDOUT] **************doAnything now************i==11
14:14:53,546 INFO [STDOUT] **************doAnything now************i==12
14:14:53,578 INFO [STDOUT] **************doAnything now************i==13
14:14:53,625 INFO [STDOUT] **************doAnything now************i==14
14:14:53,703 INFO [STDOUT] **************doAnything now************i==15
14:14:53,750 INFO [STDOUT] **************doAnything now************i==16
14:14:53,781 INFO [STDOUT] **************doAnything now************i==17
14:14:53,828 INFO [STDOUT] **************doAnything now************i==18
14:14:53,859 INFO [STDOUT] **************doAnything now************i==19
14:14:53,906 INFO [STDOUT] **************doAnything now************i==20
14:14:53,937 INFO [STDOUT] **************doAnything now************i==21
14:14:53,968 INFO [STDOUT] **************doAnything now************i==22
14:14:54,015 INFO [STDOUT] **************doAnything now************i==23
14:14:54,062 INFO [STDOUT] **************doAnything now************i==24
14:14:54,109 INFO [STDOUT] **************doAnything now************i==25
14:14:54,140 INFO [STDOUT] **************doAnything now************i==26
14:14:54,187 INFO [STDOUT] **************doAnything now************i==27
14:14:54,218 INFO [STDOUT] **************doAnything now************i==28
14:14:54,250 INFO [STDOUT] **************doAnything now************i==29
14:14:54,281 INFO [STDOUT] **************doAnything now************i==30
14:14:54,296 INFO [STDOUT] **************doAnything now************i==31
14:14:54,343 INFO [STDOUT] **************doAnything now************i==32
14:14:54,359 INFO [STDOUT] **************doAnything now************i==33
14:14:54,390 INFO [STDOUT] **************doAnything now************i==34
14:14:54,421 INFO [STDOUT] **************doAnything now************i==35
14:14:54,437 INFO [STDOUT] **************doAnything now************i==36
14:14:54,484 INFO [STDOUT] **************doAnything now************i==37
14:14:54,515 INFO [STDOUT] **************doAnything now************i==38
14:14:54,546 INFO [STDOUT] **************doAnything now************i==39
14:14:54,578 INFO [STDOUT] **************doAnything now************i==40
14:14:54,609 INFO [STDOUT] **************doAnything now************i==41
14:14:54,656 INFO [STDOUT] **************doAnything now************i==42
14:14:54,671 INFO [STDOUT] **************doAnything now************i==43
14:14:54,703 INFO [STDOUT] **************doAnything now************i==44
14:14:54,828 INFO [STDOUT] **************doAnything now************i==45
14:14:54,843 INFO [STDOUT] **************doAnything now************i==46
14:14:54,875 INFO [STDOUT] **************doAnything now************i==47
14:14:54,906 INFO [STDOUT] **************doAnything now************i==48
14:14:54,937 INFO [STDOUT] **************doAnything now************i==49
这个是JBOSS的输出。


下面帖出主要代码:
下面的是在mian方法中运行的

  public void testExampleSessionBean() throws RemoteException, CreateException,
      RemoveException, RemoteException {

System.out.print("************start time**********************");
System.out.println(new Date());
     for(int i=0;i<50;i++){
       ExampleSessionHome home = (ExampleSessionHome)getEJBHome("ExampleSessionBean");
       ExampleSession remote = home.create();
       remote.doAnything(i);
       remote.remove();
     }
System.out.print("**************end time********************");
System.out.println(new Date());
  }
<p class="indent">


下面是EJB的业务方法

  public void doAnything(int i){
System.out.println("**************doAnything now************i=="+i);
  }


  public void ejbRemove() {
System.out.println("**************removing************");
  }
<p class="indent">


该例子说明一个结果:
SLSB在调用remove后,不会在容器中销毁!
而是在客户端注销掉,释放掉资源,容器中的
SLSB instance还是存在的。

并且我运行了很多次,也没有看到有remove的输出。



你用完了之后就在这个remote stub上调用remove()方法,容器就会销毁这个ejb对象。
我不清楚的是这个ejb对象,难道容器不能重用他们么?

所以你上面的话,有问题。

wwlhp@jdon
2004-09-29 15:52
楼上应该先搞清出bean instance和ejb object之间的区别。我说的是ejb object,而你一直在说bean instance。

SportsBaby1980
2004-09-30 10:30
我又仔细的看了一下:
发现我是搞错了。
你是不想每一次都查找JNDI创建EJBHOME?
和EJB REMOTE ?

不知道我这样理解的对否?