server.tomcat.max-threads VS corePoolSize VS spring.datasource.tomcat.max

Posted

技术标签:

【中文标题】server.tomcat.max-threads VS corePoolSize VS spring.datasource.tomcat.max【英文标题】: 【发布时间】:2019-06-05 04:07:56 【问题描述】:

我有一个 Spring Boot REST 异步应用程序,想要调整:

    来自客户端的连接线程(希望 REST 请求并行) 我的服务层中@Async 方法的线程数 与数据库的连接池

浏览文档和网站发现了可能性:

corePoolSize value=... VS server.tomcat.max-threads = ... - 有什么区别?

spring.datasource.hikari.maximum-pool-size= ... VS spring.datasource.tomcat.max... = ... - 有什么区别?

【问题讨论】:

【参考方案1】:

假设您使用的是 Spring Boot 2.1 并且没有更改默认值(使用 Tomcat 作为嵌入式容器,Hikari 作为连接池)。

Tomcat 请求处理线程

要修改线程数(tomcat 默认已经使用 200,为什么还要更改它!)使用 server.tomcat 命名空间中的属性(这些是特定于 Tomcat 的!所以使用 server.tomcat.max-threads 来控制请求处理的数量。

要限制并发 HTTP 连接的数量,请使用 server.tomcat.max-connections(默认值 10000)。这基本上是请求处理线程用来从中挑选/窃取工作的处理队列。

任务执行的线程数

为了控制 Spring Boot 2.1 中默认创建的 TaskExecutor 使用的线程数,请使用 spring.task.execution 命名空间中的属性。所以使用spring.task.execution.pool.max-threads 来设置@Async 使用的最大线程数。 spring.task.execution.pool.core-size 控制核心(最小)池大小。在不通过spring.task.execution.pool.queue-capacity 限制队列大小的情况下增加max-threads 属性无效。默认队列大小是无限制的,并且一切都不会导致线程数超过core-size

连接池属性

最后为您的连接池指定连接(Hikari 的默认值为 10!)。使用 spring.datasource 命名空间属性,特别是用于连接池的属性(默认是 Hikari,所以 spring.datasource.hikari 中的那些,spring.datasource.tomcat 用于 Tomcat JDBC 连接池,在 2.0 之前的 Spring Boot 上用作默认值)。所以设置spring.datasource.hikari.maximum-pool-size 来管理最大线程数。

注意

它们彼此没有任何关系,也应该相互混淆(恕我直言,参考指南中已经清楚地说明了它们各自的用途不同)。请参阅 Spring Boot 参考指南的 Appendix A 以获取常用属性列表。

【讨论】:

是Spring Boot使用的默认连接池(我的回答第一行有提到)。 连接池是否仅用于数据库连接?它会影响哪些其他连接?可以单独为DB和其他连接配置吗?

以上是关于server.tomcat.max-threads VS corePoolSize VS spring.datasource.tomcat.max的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot max-threads设置方式(2.3 版本以后)

Spring Boot 连接池理解

springboot x.x.x RELEASE不同版本的差异

SpringBoot 内置 Tomcat 线程数优化配置,你学会了吗?

application.properties 和 pom.xml

application.properties 和 pom.xml