1

之间是否存在常识公认的比率

  • HTTP 连接器maxThreads(处理用户请求的最大 HTTP 线程数),
  • HTTP 连接器acceptCount(当所有可能的请求处理线程都在使用时,传入连接请求的最大队列长度)
  • DB pool maxActive(池中的最大 DB 连接数)配置属性

当涉及到使用大量使用数据库的tomcat的Web基础应用程序时?

我的意思是,例如,我们几乎每个 HTTP 请求连接都在密集使用数据库。因此,当我们拥有 fe 时,配置的 DP 池maxActive(例如 100)要少得多,而 HTTP 连接器的maxThreads (例如 200)要大两倍。那么就有可能在 HTTP 连接之间共享一个相同的 DB 连接。这可能会导致大量的数据库使用/数据库停止连接

我知道在大多数情况下,Web HTTP 请求配置与数据库池配置无关,但是属性之间的比率(maxThreads/acceptCount maxActive)是否有常见的案例/实践?例如,HTTP maxThreads 大于 DB maxActive 是一种常见的做法(但根据我们的示例,认为 100% 大太多了 - 可以说最大 20% 或 50%?),假设我们有更大的 accpetCount值,所以在应用程序处理其他 HTTP 请求时将 HTTP 请求排队?

这里有类似的问题:Tomcat - 在 Http 连接器中配置 maxThreads 和 acceptCount但没有更准确的答案

4

1 回答 1

1

首先,澄清几点:

  • JDBC 连接不在线程之间共享,以避免破坏隔离要求。如果池用尽,请求将在队列中等待,直到分配连接或发生超时。
  • 请求在达到maxThreads值时得到处理,任何额外的请求都被放入队列中,直到acceptCount值。

acceptCount :当所有可能的请求处理线程都在使用时,传入连接请求的最大队列长度。

  • maxActive是您示例中的瓶颈,因此超出该数量的请求将等待数据库连接。更准确地说,瓶颈在数据库连接池上。您不会得到停滞的数据库连接,而是等待来自池的连接的线程。

也就是说,找到这些值之间的比率没有太大价值,因为maxActive将施加限制。maxThreads >= maxActive是显而易见的经验法则。

除非您的应用程序负载如此说明,否则永远不会达到maxThreads,但是您的数据库池应该能够应对该负载,否则您的应用程序将失败。

在这种情况下,调整性能更多的是调整数据库连接池和线程池动态,而不是设置限制。一旦达到限制,就没什么可做的了,要么找到导致缓慢的代码,要么扩大规模。

池动态是指最小空闲连接/线程,保持空闲多长时间,一次在池中创建多少新条目等。

希望这可以帮助!

Tomcat 7 HTTP 连接器文档

于 2018-11-06T17:53:56.190 回答