CDI和连接池化

3

CDI是否可以以某种方式进行池化?因为我认为这是EJB bean的一个特性,但Adam Bien在这个screencast中说容器会选择通过反射创建类的新实例还是使用现有实例。所以如果我有这两个bean:

@RequestScoped
public class RequestBean {

    public void doIt() {

    }
}

@SessionScoped
public class SessionBean {

    @Inject
    private RequestBean bean;    

    public void doSomething() {
        bean.doIt();
    }
}

问题是,每次调用doSomething方法时,是否总是创建RequestBean的新实例,还是CDI容器以某种方式管理实例池?
1个回答

10

第一个是限定于请求的范围,所以每个请求都会创建一个新实例。第二个是限定于会话的范围,所以每个会话都会创建一个新实例。

CDI 不会池化和回收对象,因为它不知道对象是否具有状态, 在请求中获取到之前请求中Bean的状态将破坏请求/会话范围的设计意图。

除非bean的创建成本非常高(因为它们启动了新的连接或类似的操作),否则将它们池化并没有带来任何优势。短生命周期的对象在现今非常快速创建和垃圾回收。而如果Bean确实很昂贵,那么它应该成为单例模式。


1
但是也许有一个问题 - 基于您所说的,无状态bean池在EJB中的意义是什么?我想容器所做的是创建一个无状态bean,将其放入池中,然后在请求时撤回它,然后将所有字段重置为null并将其放回池中。那么为什么这适用于Stateless bean而不适用于RequestScoped bean,我不确定是否能看到区别。(对我来说,EJB Stateless bean和CDI RequestScoped似乎非常相似) - Petr Mensik
1
一个无状态的bean应该是无状态的。因此,它不应该有会话状态,并且开发人员知道,如果他在字段中存储了某些内容,当稍后重用时,他可以将其取回。如果现在发明无状态bean,它们可能不会被池化。但是它们是在2000年左右的一个时期发明的,当时对象分配不像现在这么快,而且我们没有现在拥有的所有经验。 - JB Nizet
所以他们发明了EJB,因为他们没有意识到CDI今天实例化是如此简单的吗?这是一个相当简单的解决方案。 - fidudidu
你说垃圾回收比分配和重用内存中的对象更快?太棒了。 - fidudidu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接