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

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

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

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

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

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

【问题讨论】:

    标签: java spring spring-boot database-connection threadpool


    【解决方案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和其他连接配置吗?
    猜你喜欢
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 2020-12-29
    • 2011-05-24
    • 2014-08-17
    • 2011-09-18
    • 1970-01-01
    相关资源
    最近更新 更多