2011-06-16 39 views
4

上午通过企业会话bean去material.i有疑惑就低于oints: -状态会话bean池的大小

1)可以说,我们提到的池大小为50对一些statful会话bean。不同的50个客户使用它们。 所以现在所有的50个豆都保持着某种状态。在什么时候这些状态会被移除,这样如果第51个客户请求bean,它就不会得到任何先前被破坏的状态。

2)可以说我们提到池的大小为50对于某些无状态会话bean,并且全部都在使用某个 时间点。如果第51个客户端来请求一个bean,那么等到某个bean变成空闲的时候 还是创建新的bean实例?

+0

这是所有供应商特定的。你正在使用哪个EJB容器?我建议在问题中添加“glassfish”,“openejb”,“weblogic”,“websphere”等标签。 – 2011-06-16 22:06:44

回答

5

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

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

+0

感谢Mike在上面提出了另一个问题,我们是否提到特定bean的池大小,还是应用程序中所有无状态会话bean的集合?当这些实例被添加到池中时。当请求进入服务器或启动服务器时会发生吗? – 2011-06-17 07:51:02

+0

可以为单个bean设置实例池大小。您不知道何时将实例添加到池中,但通常需要无状态会话Bean。对于单例会话bean,您可以使用注释来表示您希望在服务器启动时创建bean。 – akira 2011-06-17 09:30:39

5

由于bkail声明@Stateless bean的池化语义是特定于供应商的。也就是说在EJB 3.1中我们添加了@AccessTimeout注释,该注释可以用于豆类或@Stateless,@Stateful@Singleton bean的方法。

@AccessTimeout

在一般意义上,这批注便携指定了多久,如果等待条件与并发访问时主叫方将等待。具体到每个bean的类型,等待何时将发生的条件:

  • @Singleton - 一个@Lock(WRITE)方法被调用并且正在使用容器管理并发。所有方法默认为@Lock(WRITE)
  • @Stateful - 调用实例的任何方法并发生第二次调用。或者@Stateful bean在一个事务中,调用者从该事务之外调用它。
  • @Stateless - 池中没有实例可用。但是,正如所指出的那样,汇集语义,如果有的话,不包括在规范中。如果供应商的池语义确实包含等待条件,则应该使用@AccessTimeout。

用法

@AccessTimeout是简单地围绕java.util.concurrent API中常用longTimeUnit元组一个方便的包装。

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

当一个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,默认值是必需的。”