java - tomcat - HTTP 连接器 maxThreads/acceptCount 与 JDBC 池 maxActive 之间的比率

标签 java tomcat httpconnection jdbc-pool

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

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

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

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

这里有类似的问题:Tomcat - Configuring maxThreads and acceptCount in Http connector但没有更准确的答案

最佳答案

首先,澄清几点:

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

acceptCount: The maximum queue length for incoming connection requests when all possible request processing threads are in use.

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

也就是说,找到这些值之间的比率没有太大值(value),因为 ma​​xActive 会施加限制。 ma​​xThreads >= maxActive 是显而易见的经验法则。

ma​​xThreads 永远不会达到,除非您的应用程序负载如此,但是您的数据库池应该能够处理该负载,否则您的应用程序将失败。

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

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

希望这对您有所帮助!

Tomcat 7 HTTP connector docs .

关于java - tomcat - HTTP 连接器 maxThreads/acceptCount 与 JDBC 池 maxActive 之间的比率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53175905/

相关文章:

java - 我可以使用 Java 来运行 .jasper 文件,而不必即时编译 jrxml 吗?

java - eclipse 将 Java 代码样式设置存储到什么文件?

java - JDK11之后WSIMPORT在哪里

java - 为什么 Tomcat 在取消部署时会抛出 'java.lang.IllegalStateException: Class invariant violation'?

java - 无法访问远程 pentaho 双服务器

java - HTTP Post 方法,我们可以提交的最大字节/数据?

java - 通过按钮插入和删除列

php - 如何将 Laravel 项目插入 Apache Tomcat servlet?

java - 登录 PHP 表单,然后用 Java 运行 PHP 脚本

java - 从 Android 客户端连接到 servlet 时出现问题