线程池配置Java应用服务器

时间:2013-12-07 00:14:09

标签: java glassfish ejb threadpool

我正在维护一个几乎没有作为SOAP Web服务公开的服务的应用程序。我最近遇到了一些扩展问题,因为应用程序比正常情况下负载更多。

我想知道我对几个池配置的理解是否正确, 1.我们有如下的线程池配置,

<thread-pools>
    <thread-pool name="admin-thread-pool" max-thread-pool-size="50" max-queue-size="1024"></thread-pool>
    <thread-pool name="http-thread-pool" max-thread-pool-size="250"></thread-pool>
    <thread-pool name="http-thread-pool-internal" max-thread-pool-size="50"></thread-pool>
    <thread-pool name="thread-pool-1" max-thread-pool-size="200"></thread-pool>
</thread-pools>

<transports>
    <transport name="tcp" acceptor-threads="8"></transport>
</transports>

和 2. EJB池配置如下,

<ejb-container steady-pool-size="0" max-pool-size="50"  pool-resize-quantity="10">

现在问题。

  1. 如果http线程池收到需要同步执行的任务,并且池中没有足够的EJB bean实例(最大配置为50),会发生什么情况,因为所有EJB实例都在为其他http请求提供服务? 注意:我们正在进行JNDI查找而不使用@EJB注释。

  2. 增加EJB实例(max)的数量等于http-threadpool值是否有意义?

  3. 在进行一些分析后,发现查找EJB实例的代码需要很长时间才能返回。这是否意味着没有可用的EJB实例,并且请求必须等到其他正在运行的线程释放实例?

1 个答案:

答案 0 :(得分:5)

  

如果http线程池收到需要同步执行的任务,并且池中没有足够的EJB bean实例(最大配置为50),会发生什么情况,因为所有EJB实例都在为其他http请求提供服务?

EJB池不是JEE规范的一部分,因此,池化行为取决于供应商。根据Glassfish documentation(可能会因版本而异),如果池大小小于steady-pool-size,当新请求到达时,Container将创建X个新的ejb实例,其中X由{确定{1}}价值。因此,你不应该耗尽合并的ejb。 pool-resize-quantity不是固定限制。

  

增加EJB实例(max)的数量等于http-threadpool值是否有意义?

可能是正确的,但请注意,如果在高负载期间需要更多ejb,Container将自动增加池大小。 我会将max-pool-size更改为大于0的值。

  

在进行一些分析后,发现查找EJB实例的代码需要很长时间才能返回。这是否意味着没有可用的EJB实例,并且请求必须等到其他正在运行的线程释放实例?

如果(可能是一个错误的配置池)服务器耗尽了可用的ejb,它会更多地创建一个新实例,而不是序列化客户端请求。这就是规范(ejb 3.1)所说的:

  

4.7无状态会话Bean   ...如果需要处理客户端工作负载的增加,容器会创建另一个无状态会话bean实例...

创建一个新的ejb实例不应该太昂贵,除非你的bean必须在初始化时执行特定的业务逻辑(例如@PostConstruct注释方法的逻辑)。

请记住,在高负载下,还有其他更多相关问题,而不是需要监控的池配置,如cpu和内存服务器使用情况。