有状态会话bean池大小

M S*_*ach 4 ejb

我正在通过企业会话bean材料.我怀疑下面的oints: -

1)假设我们提到某个有状态会话bean的池大小为50.不同的50个客户使用它们.所以现在所有的50个豆子都维持着一些状态.在什么时候这些状态将被删除,以便如果第51个clien要求bean,它不会得到任何先前被破坏的状态.

2)假设我们提到某些无状态会话bean的池大小为50,并且在某些时间点都在使用.如果第51个客户端来请求bean,是否会等到某个bean变为空闲或创建新的bean实例?

Mik*_*aun 5

有状态会话bean通常不会被合并.这是可能的,但是他们的状态使得它们不太理想,因为客户在获得参考时期望获得新鲜豆.

对于无状态bean,是的,第51个客户端将不得不等待.这通常是一件好事,因为它会自动调节系统的资源消耗.根据您拥有的资源,工作负载以及单次调用ssb所需的工作量,您可能希望调整池的大小.


Dav*_*ins 5

正如bkail所述,@ Stateless bean的池语义是特定于供应商的.在EJB 3.1说,我们增加了@AccessTimeout它可以在bean类或方法中使用的注释@Stateless,@Stateful@Singleton豆.

@AccessTimeout

在一般意义上,此注释可移植地指定如果在并发访问时发生等待条件,则调用者将等待多长时间.具体到每种bean类型,等待条件将在以下情况发生:

  • @Singleton- @Lock(WRITE)正在调用一个方法,并且正在使用容器管理的并发.@Lock(WRITE)默认情况下,所有方法.
  • @Stateful - 正在调用实例的任何方法,并发生第二次调用.或@Stateful bean在一个事务中,调用者从该事务外部调用它.
  • @Stateless - 池中没有可用的实例.但是,如上所述,汇集语义(如果有)不在规范范围内.如果供应商的池化语义确实涉及等待条件,则应该应用@AccessTimeout.

用法

@AccessTimeout仅仅是围绕着一个便利的包装long,并TimeUnit在常用的元组java.util.concurrentAPI.

import java.util.concurrent.TimeUnit;
@Target({METHOD, TYPE})
@Retention(RUNTIME)
public @interface AccessTimeout {
    long value();
    TimeUnit unit() default TimeUnit.MILLISECONDS; 
}
Run Code Online (Sandbox Code Playgroud)

在bean类或方法上显式设置时,它有三种可能的含义:

  • @AccessTimeout(-1) - 永不超时,等待一段时间.可能永远.
  • @AccessTimeout(0) - 永远不要等 ConcurrentAccessException如果发生等待情况,立即投掷.
  • @AccessTimout(30, TimeUnit.SECONDS) - 如果出现等待情况,请等待30秒.之后,扔掉ConcurrentAccessTimeoutExcpetion

没有标准默认值

请注意,该value属性没有默认值.这是故意的,旨在表明如果@AccessTimeout没有明确使用,您获得的行为是特定于供应商的.

一些供应商将等待预先配置的时间并抛出javax.ejb.ConcurrentAccessException,一些供应商将立即抛出它.当我们定义这个注释时,很明显我们所有的供应商都做了一些不同的事情,强制执行默认会导致现有应用程序出现问题.

在类似的说明中,在EJB 3.0之前没有默认的事务属性,并且每个供应商都有所不同.谢天谢地,EJB 3.0已经足够不同了,我们终于可以说,"对于EJB 3.0 bean,默认是必需的."