不知道你的Session Bean用来做什么?
如果是大量的计算,难道你就可以直接返回?
如果那样的话,怎么知道是否操作成功?

解决方案 »

  1.   

    有一个专门的Java Class(extend Thread)用来进行计算,在Stateless Session Bean里面只是实例化该类,传递参数,启动该线程,Session Bean不参与计算,当然可以直接返回.当然操作结果要通过某些途径返回给用户.我现在最想知道的就是这种方法的弊端.
      

  2.   

    Stateless session bean应该不会是同时只允许一个实例运行的。哪怕容器的确只实例化一个bean instance,但也允许多个request同时执行里面的方法吧。
      

  3.   

    EJB Container会维持一个实例池,当一个客户端需要Stateless Session Bean提供服务时,EJB Container会分配一个Bean实例给客户端,一个bean instance只能对应一个client,不象Servlet container维持一个线程池,当一个http request发送来时,分配一个thread,Servlet只有一个instance,所以允许多个request同时执行里面的方法,但EJB不一样.
    假如Stateless Session Bean instance长期被占用,当有大量用户访问(并发)时,系统就可能出现性能严重下降或者崩溃.
      

  4.   

    楼主,我没有理解你的这句话:
    所以我采用了在Stateless Session Bean启动一新线程计算
    呵呵
    如何启动???
      

  5.   

    可能我写的不够严密.
    整个过程是这样的:首先写一个类(extend Thread),该类的主要任务就是计算并且有一个启动函数用于启动自身线程,在Stateless Session Bean创建该类的对象,再调用这个启动函数.
      

  6.   

    规范里说stateless session bean的一个instance支持多个client请求的,你可以试一下。我认为不开新线程也不会因此阻塞其他用户,因为多个request本来就是在不同的线程里调用bean,而这个bean的方法也不是synchronized的。不过启动新线程的可以让方法立即返回,实现异步调用,提高程序响应速度(能通过其他途径返回结果的前提下)
      

  7.   

    EJB中禁止使用任何与线程相关的代码。syncronized关键字、启动新线程的操作都在禁止之列。在EJB中操作线程会降低EJB容器正确管理运行时环境的能力,有可能造成无法预知的结果。楼上allanic(阿伦)还煞有介事地在这回答,你到底有没有用过EJB?
      

  8.   

    to Schlemiel(维特根斯坦的扇子)nod建议楼主读一下EJB规范
      

  9.   

    EJB中禁止使用任何与线程相关的代码,但实际上也可以进行多线程编程,如果直接在Session Bean函数里调用start()当然不行,但通过间接的手段却可以,比如在多线程类中定义一个函数,
    public void startComputing() {
        this.start();
    }
    然后在Session Bean中创建多线程类的对象,再调用startComputing()就可以了。假如不用多线程,那又怎么解决长时间计算导致Stateless Session Bean instance无法重用的问题。 
    to Schlemiel(维特根斯坦的扇子):
    我知道你是高手,请多指点。
    to raimundo():
    EJB规范那么多页,我也不好找,你能不能把相关的那几页贴出来。