论坛首页 Java企业应用论坛

有关 EJB3,无状态会话Bean 与 Spring 依赖注入 Singleton 的困惑!

浏览 9833 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-02-06  
最近我在学习 EJB3。关于它的无状态会话Bean,我有一些困惑。

按照 EJB3 规范,容器会为每一种无状态会话 Bean 创建一定数量的实例,然后将它们保存在一个缓冲池(pool) 里面,然后根据调用的情况,将它们在调用者之间分配。书上特别强调了,因为这些 bean 都是无状态的,所以自由度很高。比如说,一个对象调用了无状态会话 Bean 的方法A,执行了一段时间;然后,又调用了同一个 Bean 的方法B。但实际上,它调用的是实例 1 的方法A,和实例 2 的方法B。只不过这一切,对调用者来说都是透明的。

这就是我的困惑所在。我们都知道,可以用无状态的 Singleton 来封装一些领域服务。比如说,UserService,就可以是一个 Singleton class。在实际使用时,可以用 IoC 容器的依赖注入方法得到它的一个(全 JVM 唯一的)Singleton 实例,然后再调用它里面的方法,比如说:
public class ... {
    private UserService userService;
    public void setUserService(UserService v) {
        // IoC 容器将会注入 UserService 的一个实现的实例,
        // 这也将是整个 JVM 共享的一个实例。
        userService = v;
    }

    ...

    public boolean isValidUser(String username, String password) {
        User user = userService.processLogin(username, password);
        return (user != null);
    }

}


一切都很基础。

我现在主要的问题就是,EJB 容器为无状态会话 Bean 创建多个实例并缓冲,到底有什么特别的好处?既然他们是无状态的,为什么不可以整个系统共享一个实例呢?难道说,多个实例的执行效率更高?这似乎颠覆了我个人的 JVM 基本概念.....

请各位指教。谢谢。
   发表时间:2007-02-06  
对象池是对早期JVM性能上的妥协,现在的存在意义值的怀疑
0 请登录后投票
   发表时间:2007-02-06  
dennis_zane 写道
对象池是对早期JVM性能上的妥协,现在的存在意义值的怀疑
如果对象中需要sleep(c/s中会有用)没有池那大家只能等着
0 请登录后投票
   发表时间:2007-02-06  
抛出异常的爱 写道
dennis_zane 写道
对象池是对早期JVM性能上的妥协,现在的存在意义值的怀疑
如果对象中需要sleep(c/s中会有用)没有池那大家只能等着


但是,sleep的含义是令 当前 thread 进入睡眠状态啊。

比如,我的一个对象 I 在一个 thread 里面调用了 userService 的方法 A,但因为某种原因,执行了方法 A 中的 Thread.sleep(xxx) 语句。与此同时,另一个对象 II 在另一个 thread 里面也试图调用 userService 的方法 A。我认为,这时候,对象 II 的调用不会被阻挡,因为 UserService 类是无状态的,方法 A 也就不是 synchronized 的。

所以,这样看来,无状态 bean 似乎确实不需要对象池来缓冲.....Singleton 就好了...
0 请登录后投票
   发表时间:2007-02-06  
dennis_zane 写道
对象池是对早期JVM性能上的妥协,现在的存在意义值的怀疑


哦,谢谢。这和我的困惑有点类似,就是无状态bean的对象池似乎没有必要。Singleton 就好了。
0 请登录后投票
   发表时间:2007-02-06  
ejb3.0最终没有能颠覆它原来的线程模型,其中缘由不是三言两语能够说清楚的,但是

引用
这似乎颠覆了我个人的 JVM 基本概念
似乎太夸张了吧。
0 请登录后投票
   发表时间:2007-02-06  
ahuaxuan 写道
ejb3.0最终没有能颠覆它原来的线程模型,其中缘由不是三言两语能够说清楚的,但是

引用
这似乎颠覆了我个人的 JVM 基本概念
似乎太夸张了吧。


哈哈,初级会员嘛,夸张在所难免。

个人的 JVM 基本概念,就是 JVM 会(在不同线程中)同时执行一个对象的非 synchronized 方法的多个拷贝,不需要任何额外的等待时间。

基于这个概念,我认为,使用无状态的 singleton 类来当 XyzService,是最佳的选择,不会有任何效率上的不良影响。

也因此,我不明白 EJB 为无状态 session bean 提供对象池的意义何在。当然,我以前没有做过 EJB 1, 2 的项目,所以对其历史不了解。希望资深的各位大侠不吝赐教!
0 请登录后投票
   发表时间:2007-02-06  
非典型程序员 写道
ahuaxuan 写道
ejb3.0最终没有能颠覆它原来的线程模型,其中缘由不是三言两语能够说清楚的,但是

引用
这似乎颠覆了我个人的 JVM 基本概念
似乎太夸张了吧。


哈哈,初级会员嘛,夸张在所难免。

个人的 JVM 基本概念,就是 JVM 会(在不同线程中)同时执行一个对象的非 synchronized 方法的多个拷贝,不需要任何额外的等待时间。

基于这个概念,我认为,使用无状态的 singleton 类来当 XyzService,是最佳的选择,不会有任何效率上的不良影响。

也因此,我不明白 EJB 为无状态 session bean 提供对象池的意义何在。当然,我以前没有做过 EJB 1, 2 的项目,所以对其历史不了解。希望资深的各位大侠不吝赐教!
一说倒还真是的,以前只知道有一个线程池的概念,但是为什么需要它不是很清楚!
0 请登录后投票
   发表时间:2007-02-06  
Stateless Session Bean设计池的概念应该是不同的调用端同一时间访问的一定不是同一个Bean实例!
0 请登录后投票
   发表时间:2007-02-06  
jamesby 写道
Stateless Session Bean设计池的概念应该是不同的调用端同一时间访问的一定不是同一个Bean实例!


对,我也认为,调用端会随机的访问不同的bean实例。

但我不认为这样效率会更高些。否则的话,Spring 也应该隐含的为那些 service bean 提供缓冲池,而不是简单的用 singleton 来解决问题。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics