精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-02-06
按照 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 基本概念..... 请各位指教。谢谢。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-02-06
对象池是对早期JVM性能上的妥协,现在的存在意义值的怀疑
|
|
返回顶楼 | |
发表时间:2007-02-06
dennis_zane 写道 对象池是对早期JVM性能上的妥协,现在的存在意义值的怀疑 如果对象中需要sleep(c/s中会有用)没有池那大家只能等着
|
|
返回顶楼 | |
发表时间: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 就好了... |
|
返回顶楼 | |
发表时间:2007-02-06
dennis_zane 写道 对象池是对早期JVM性能上的妥协,现在的存在意义值的怀疑
哦,谢谢。这和我的困惑有点类似,就是无状态bean的对象池似乎没有必要。Singleton 就好了。 |
|
返回顶楼 | |
发表时间:2007-02-06
ejb3.0最终没有能颠覆它原来的线程模型,其中缘由不是三言两语能够说清楚的,但是
引用 这似乎颠覆了我个人的 JVM 基本概念 似乎太夸张了吧。
|
|
返回顶楼 | |
发表时间:2007-02-06
ahuaxuan 写道 ejb3.0最终没有能颠覆它原来的线程模型,其中缘由不是三言两语能够说清楚的,但是
引用 这似乎颠覆了我个人的 JVM 基本概念 似乎太夸张了吧。哈哈,初级会员嘛,夸张在所难免。 我个人的 JVM 基本概念,就是 JVM 会(在不同线程中)同时执行一个对象的非 synchronized 方法的多个拷贝,不需要任何额外的等待时间。 基于这个概念,我认为,使用无状态的 singleton 类来当 XyzService,是最佳的选择,不会有任何效率上的不良影响。 也因此,我不明白 EJB 为无状态 session bean 提供对象池的意义何在。当然,我以前没有做过 EJB 1, 2 的项目,所以对其历史不了解。希望资深的各位大侠不吝赐教! |
|
返回顶楼 | |
发表时间:2007-02-06
非典型程序员 写道 ahuaxuan 写道 ejb3.0最终没有能颠覆它原来的线程模型,其中缘由不是三言两语能够说清楚的,但是
引用 这似乎颠覆了我个人的 JVM 基本概念 似乎太夸张了吧。哈哈,初级会员嘛,夸张在所难免。 我个人的 JVM 基本概念,就是 JVM 会(在不同线程中)同时执行一个对象的非 synchronized 方法的多个拷贝,不需要任何额外的等待时间。 基于这个概念,我认为,使用无状态的 singleton 类来当 XyzService,是最佳的选择,不会有任何效率上的不良影响。 也因此,我不明白 EJB 为无状态 session bean 提供对象池的意义何在。当然,我以前没有做过 EJB 1, 2 的项目,所以对其历史不了解。希望资深的各位大侠不吝赐教! |
|
返回顶楼 | |
发表时间:2007-02-06
Stateless Session Bean设计池的概念应该是不同的调用端同一时间访问的一定不是同一个Bean实例!
|
|
返回顶楼 | |
发表时间:2007-02-06
jamesby 写道 Stateless Session Bean设计池的概念应该是不同的调用端同一时间访问的一定不是同一个Bean实例!
对,我也认为,调用端会随机的访问不同的bean实例。 但我不认为这样效率会更高些。否则的话,Spring 也应该隐含的为那些 service bean 提供缓冲池,而不是简单的用 singleton 来解决问题。 |
|
返回顶楼 | |