SpringBoot优化内嵌的Tomcat ---设置MaxConnections

本文介绍如何在SpringBoot中通过三种不同方法调整内嵌Tomcat服务器的最大连接数,以提升应用性能,并解决重启时遇到的特定错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用kill -9杀掉springboot应用后,立马java -jar重启,会报错,需要等待一段时间才能启动成功,
报错的原因是:/tmp/tomcat-docbase.4749794910434376321.9086] is not valid
以下是详细错误信息:

Caused by: org.apache.catalina.LifecycleException: Failed to start component [org.apache.catalina.webresources.StandardRoot@53001498]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:158) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:4831) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4963) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
... 7 more
Caused by: java.lang.IllegalArgumentException: The main resource set specified [/tmp/tomcat-docbase.4749794910434376321.9086] is not valid
at org.apache.catalina.webresources.StandardRoot.createMainResourceSet(StandardRoot.java:725) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
at org.apache.catalina.webresources.StandardRoot.startInternal(StandardRoot.java:686) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:152) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:4831) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4963) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
... 7 more
mealtime-report-[15:48:37:716] [ERROR] - org.apache.juli.logging.DirectJDKLog.log(DirectJDKLog.java:181) - A child container failed during start

 

[root@localhost tmp]# ls -dlt tomcat*
drwxr-xr-x 3 root root 4096 May 15 14:19 tomcat.2482651926943103152.4444
drwxr-xr-x 2 root root 4096 May 15 14:19 tomcat-docbase.1606353072223048027.4444
drwxr-xr-x 3 root root 4096 May 15 14:19 tomcat.6427937730432992105.4004
drwxr-xr-x 2 root root 4096 May 15 14:19 tomcat-docbase.9014354490424152602.4004
drwxr-xr-x 3 root root 4096 May 14 18:21 tomcat.365692316696650885.2000
drwxr-xr-x 2 root root 4096 May 14 18:21 tomcat-docbase.8871210702020412482.2000
drwxr-xr-x 3 root root 4096 May 14 18:21 tomcat.9194454391130879725.2222
drwxr-xr-x 2 root root 4096 May 14 18:21 tomcat-docbase.6449009990528406178.2222
drwxr-xr-x 3 root root 4096 May 11 16:31 tomcat.7533402776366547594.3333
drwxr-xr-x 2 root root 4096 May 11 16:31 tomcat-docbase.8347169054078560101.3333
drwxr-xr-x 3 root root 4096 May 11 16:31 tomcat.5755321441664547955.3004
drwxr-xr-x 2 root root 4096 May 11 16:31 tomcat-docbase.4368794759444711233.3004
drwxr-xr-x 3 root root 4096 May 11 16:31 tomcat.7487101127514666304.4444
drwxr-xr-x 2 root root 4096 May 11 16:31 tomcat-docbase.3505389582011000978.4444
drwxr-xr-x 3 root root 4096 May 11 16:30 tomcat.6483749742824168608.4004
drwxr-xr-x 2 root root 4096 May 11 16:30 tomcat-docbase.2936863713994400124.4004
drwxr-xr-x 3 root root 4096 May 11 16:30 tomcat.8814016287852028090.2000
drwxr-xr-x 2 root root 4096 May 11 16:30 tomcat-docbase.5759661693624441557.2000
drwxr-xr-x 3 root root 4096 May 11 16:30 tomcat.3084296173620137759.2222
drwxr-xr-x 2 root root 4096 May 11 16:30 tomcat-docbase.2913734529869658765.2222
drwxr-xr-x 3 root root 4096 May 11 16:30 tomcat.1261539854295462589.3333
drwxr-xr-x 2 root root 4096 May 11 16:30 tomcat-docbase.4327066414867055940.3333
drwxr-xr-x 3 root root 4096 May 11 16:30 tomcat.1652439996406851728.3004
drwxr-xr-x 2 root root 4096 May 11 16:30 tomcat-docbase.5233226104416503892.3004
drwxr-xr-x 3 root root 4096 May 11 11:38 tomcat.8505864110333115533.3333
drwxr-xr-x 2 root root 4096 May 11 11:38 tomcat-docbase.5036544091928181133.3333
drwxr-xr-x 3 root root 4096 May 11 11:37 tomcat.494020510980868278.3004
drwxr-xr-x 2 root root 4096 May 11 11:37 tomcat-docbase.468265602651303178.3004
drwxr-xr-x 3 root root 4096 May 11 11:36 tomcat.8093369488059063930.3004
drwxr-xr-x 2 root root 4096 May 11 11:36 tomcat-docbase.7679645853200594654.3004
drwxr-xr-x 3 root root 4096 May 11 11:31 tomcat.5040740781547956399.4444
drwxr-xr-x 2 root root 4096 May 11 11:31 tomcat-docbase.8256790475295084303.4444
drwxr-xr-x 3 root root 4096 May 11 11:31 tomcat.7344112750169248130.4004
drwxr-xr-x 2 root root 4096 May 11 11:31 tomcat-docbase.2016044219412775812.4004
drwxr-xr-x 3 root root 4096 May 11 11:30 tomcat.3866209351076068036.4444

 

 

 

SpringBoot测试版本

<parent>  
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-starter-parent</artifactId>  
    <version>1.3.3.RELEASE</version>  
</parent>  
<dependencies>  
    <dependency>  
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-starter-web</artifactId>  
    </dependency>  
</dependencies>  

SpringBoot默认使用的是Tomcat作为web server

 

springboot中默认可以通过配置如下参数设置内嵌容器Tomcat的端口,最大线程数等等

server.port=8081
server.tomcat.max-threads=1000

但是,无法设置最大连接数,而最大连接数直接影响到Tomcat的性能,如何调整这个最大连接数呢?

以下有三种方法

一:

import org.apache.catalina.connector.Connector;  
import org.apache.coyote.http11.Http11NioProtocol;  
import org.springframework.boot.context.embedded.EmbeddedServletContainer;  
import org.springframework.boot.context.embedded.ServletContextInitializer;  
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;  
import org.springframework.stereotype.Component;  
  
@Component()  
public class MyEmbeddedServletContainerFactory extends TomcatEmbeddedServletContainerFactory  
{  
    public EmbeddedServletContainer getEmbeddedServletContainer(ServletContextInitializer... initializers)  
    {  
        //设置端口  
        this.setPort(8081);  
        return super.getEmbeddedServletContainer(initializers);  
    }  
      
    protected void customizeConnector(Connector connector)  
    {  
        super.customizeConnector(connector);  
        Http11NioProtocol protocol = (Http11NioProtocol)connector.getProtocolHandler();  
        //设置最大连接数  
        protocol.setMaxConnections(2000);  
        //设置最大线程数  
        protocol.setMaxThreads(2000);  
        protocol.setConnectionTimeout(30000);  
    }  
}  

 

二:

import org.apache.catalina.connector.Connector;  
import org.apache.coyote.http11.Http11NioProtocol;  
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;  
import org.springframework.boot.context.embedded.tomcat.TomcatConnectorCustomizer;  
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  
  
@Configuration  
public class WebServerConfiguration  
{  
    @Bean  
    public EmbeddedServletContainerFactory createEmbeddedServletContainerFactory()  
    {  
        TomcatEmbeddedServletContainerFactory tomcatFactory = new TomcatEmbeddedServletContainerFactory();  
        tomcatFactory.setPort(8081);  
        tomcatFactory.addConnectorCustomizers(new MyTomcatConnectorCustomizer());  
        return tomcatFactory;  
    }  
}  
class MyTomcatConnectorCustomizer implements TomcatConnectorCustomizer  
{  
    public void customize(Connector connector)  
    {  
        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();  
        //设置最大连接数  
        protocol.setMaxConnections(2000);  
        //设置最大线程数  
        protocol.setMaxThreads(2000);  
        protocol.setConnectionTimeout(30000);  
    }  
}  

 

 

三:

import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;  
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;  
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  
  
@Configuration  
public class WebServerConfiguration  
{  
    @Bean  
    public EmbeddedServletContainerCustomizer createEmbeddedServletContainerCustomizer()  
    {  
        return new MyEmbeddedServletContainerCustomizer();  
    }  
}  
  
class MyEmbeddedServletContainerCustomizer implements EmbeddedServletContainerCustomizer  
{  
    public void customize(ConfigurableEmbeddedServletContainer container)  
    {  
        TomcatEmbeddedServletContainerFactory tomcatFactory = (TomcatEmbeddedServletContainerFactory)container;  
        tomcatFactory.setPort(8081);  
        //下面的操作可以参照上面的方法  
    }  
}  

 

最后,如果发现没有生效,就把application.properties配置里面关于Tomcat的一些配置(server.*)全部删掉,就OK了。

http://blog.youkuaiyun.com/mn960mn/article/details/51306140

 

<think>我们正在讨论SpringBootTomcat服务器的配置,特别是关于`server.tomcat.max-connections`的配置。根据引用[1]和引用[2]的内容,我们知道SpringBoot内置Tomcat的配置可以在配置文件中进行更改,并且有一些默认配置参数可以参考。引用[2]中提到了`maxConnections`、`maxThreads`和`acceptCount`等参数,并且指出在测试过程中发现实际连接数与配置值有差异。用户的问题:如何配置`server.tomcat.max-connections`或其相关参数详解。我们需要解释`max-connections`参数的含义,以及如何配置它,同时可以提及相关的参数(如`max-threads`和`accept-count`)以便用户全面了解。注意:在SpringBoot中,配置参数通常使用小写和短横线分隔(kebab-case),例如`server.tomcat.max-connections`。根据Tomcat文档和SpringBoot的配置,我们可以解释如下:-`server.tomcat.max-connections`:Tomcat服务器在任何给定时间接受和处理的最大连接数。一旦达到此限制,操作系统可能会开始拒绝连接请求。-`server.tomcat.max-threads`:工作线程池的最大大小,决定了同时处理请求的最大线程数。注意,一个连接可能对应多个请求(在HTTP/1.1keep-alive的情况下),但同一时间一个线程只能处理一个请求。-`server.tomcat.accept-count`:当所有可能的请求处理线程都在使用时,传入连接请求的最大队列度。当队列满时,任何进一步的请求都将被拒绝。配置方法:在SpringBoot的配置文件(如`application.properties`或`application.yml`)中设置这些属性。示例(在`application.properties`中):```server.tomcat.max-connections=10000server.tomcat.max-threads=200server.tomcat.accept-count=100```注意:这些参数的默认值可能因Tomcat版本和SpringBoot版本而异。例如,在SpringBoot2.5.x中,`max-threads`的默认值是200,`max-connections`的默认值可能是10000(根据Tomcat默认),`accept-count`的默认值可能是100。另外,引用[2]中提到测试时发现等待连接数比`accept-count`多1,这可能是因为操作系统级别的连接队列设置或者Tomcat内部实现的原因,但通常我们按照Tomcat的文档来理解即可。我们还可以提醒用户,这些配置需要根据实际应用的需求和服务器硬件资源进行调整,并且需要压力测试来确定合适的值。最后,我们可以生成一些相关问题。</think>### 配置 `server.tomcat.max-connections` 详解 在 Spring Boot 中,`server.tomcat.max-connections` 是控制 Tomcat 最大连接数的核心参数。以下是配置方法和相关原理: #### 1. **参数作用** - **`max-connections`**:定义 Tomcat 能同时处理的**最大连接数**(包括活跃和等待的连接-连接数达到此值时,新连接会被拒绝(返回 `Connection Refused`) - 与 `max-threads`(工作线程数)和 `accept-count`(等待队列度)共同控制并发能力[^1][^2] #### 2. **配置方式** 在 `application.properties` 或 `application.yml` 中设置: ```properties # application.properties 示例 server.tomcat.max-connections=10000 # 最大连接数 server.tomcat.max-threads=200 # 最大工作线程数 server.tomcat.accept-count=100 # 等待队列度 ``` #### 3. **参数关系** | 参数 | 默认值 | 说明 | |------|--------|------| | `max-connections` | 8192 (Tomcat 9) | 操作系统层接受的连接总数 | | `max-threads` | 200 | 实际处理请求的线程数 | | `accept-count` | 100 | 当线程全忙时,额外排队的请求数 | **工作流程**: 1. 新连接首先占用 `max-connections` 配额 2. 请求被分配给 `max-threads` 中的工作线程 3. 当线程全忙时,新请求进入 `accept-count` 队列 4. **当 `max-connections` + `accept-count` 被占满时拒绝新连接**[^2] #### 4. **优化建议** - **公式参考**: $$ \text{最大并发} \approx \text{max-threads} + \text{accept-count} $$ - **生产环境配置**: ```yaml # application.yml 示例 server: tomcat: max-connections: 10000 # 根据系统FD限制调整 max-threads: 500 # 建议为CPU核心数*200~500 accept-count: 200 # 避免过队列导致超时 ``` - **验证方法**: - 监控日志:`org.apache.tomcat.util.threads.LimitLatch` - 使用 `jconsole` 查看 `ThreadPool` 指标 #### 5. **注意事项** - 超过 `max-connections` 会直接拒绝连接(操作系统级) - Linux 系统需同步调整 `ulimit -n`(文件描述符限制) - 高并发场景建议配合 `keepalive-timeout` 减少连接重建[^1] > **配置优先级**:Spring Boot 的配置会覆盖 Tomcat 默认值,实际生效值可通过 `ManagementEndpoint` 或日志中的 `Tomcat started on port(s)` 初始化信息确认[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值