Java

发布于 更新于

AI总结: 本文介绍了Spring Boot的各种配置,包括Tomcat连接池的默认设置、HikariCP数据库连接池的参数、Jackson时区序列化的配置、日志管理、缓存机制、监控端点的安全性、文件上传限制、异步线程池、静态资源缓存策略以及数据库事务超时的处理。其中,提到的缓存实现ConcurrentHashMap缺乏过期机制和大小限制可能导致内存溢出,建议使用Caffeine替代。另需注意,默认的文件上传限制较小,可能需要调整以满足需求。此外,@Transactional注解的超时设置应当明确,以避免长时间持有数据库锁。

Spring Boot 配置

仅列举相关配置, 具体配置时, 还需要根据实际使用的版本环境进行调整.

Tomcat连接池

默认配置:
org\springframework\boot\spring-boot-autoconfigure\2.3.12.RELEASE\spring-boot-autoconfigure-2.3.12.RELEASE.jar\META-INF\spring-configuration-metadata.json

server:  
  tomcat:  
    max-connections: 10000  # 最大连接数 默认:8192  
    threads:  
      max: 800              # 最大工作线程数 默认:200  
      min-spare: 100        # 最小空闲线程数 默认:10  
    accept-count: 100       # 等待队列长度 默认:100  
    connection-timeout: 20000 # 默认未配置  

数据库连接池

SpringBoot默认使用HikariCP作为数据库连接池

spring:  
  datasource:  
    hikari:  
      maximum-pool-size: 50               # 最大连接数,默认:10  
      minimum-idle: 10                         # 最小空闲连接,默认:10  
      connection-timeout: 30000  
      idle-timeout: 600000                   # 空闲连接超时时间,默认:600000(10分钟)  
      max-lifetime: 1800000                 # 连接最大存活时间 默认:1800000(30分钟)  
      leak-detection-threshold: 60000 # 连接泄露检查阈值,默认:0(关闭)  

Jackson时区序列化

SpringBoot默认使用Jackson处理JSON序列化,Jackson会使用系统时区,这在分布式部署时会导致不一致的问题。

spring:  
  jackson:  
    time-zone: GMT+8  
    date-format: yyyy-MM-dd HH:mm:ss  
    serialization:  
      write-dates-as-timestamps: false  

日志配置

SpringBoot默认使用Logback,但默认配置下没有对日志文件进行滚动和清理。

logging:  
  file:  
    name: app.log  
  logback:  
    rollingpolicy:  
      max-file-size: 100MB  
      max-history: 30  
      total-size-cap: 3GB  

缓存配置

SpringBoot的Cacheable注解默认使用ConcurrentHashMap作为缓存实现,但这个实现没有过期机制,也没有大小限制。在高并发场景下,缓存会无限增长,最终导致内存溢出。
可以考虑使用Caffeine替代默认实现,可以提供更好的性能和内存管理能力。

spring:  
  cache:  
    type: caffeine  
    caffeine:  
      spec: maximumSize=10000,expireAfterWrite=600s  

监控端点

SpringBoot Actuator默认暴露了很多监控端点,包括健康检查、配置信息、环境变量等。

只暴露必要的端点,并且配置适当的安全策略,避免信息泄漏。

management:  
  endpoints:  
    web:  
      exposure:  
        include: health,info,metrics  
  endpoint:  
    health:  
      show-details: when-authorized  

文件上传大小限制

SpringBoot默认的文件上传限制非常小,单个文件只能上传1MB,整个请求大小限制10MB。

spring:  
  servlet:  
    multipart:  
      max-file-size: 100MB  
      max-request-size: 100MB  
      file-size-threshold: 2KB  
      location: /tmp  
      resolve-lazily: false  

异步线程池配置

使用@Async注解时,SpringBoot默认使用SimpleAsyncTaskExecutor,这个执行器每次都会创建新线程,没有线程池复用机制。高并发情况下会创建大量线程,最终导致系统资源耗尽。

spring:  
  task:  
    execution:  
      pool:  
        core-size: 8  
        max-size: 16  
        queue-capacity: 100  
        keep-alive: 60s  
      thread-name-prefix: async-task-  
    scheduling:  
      pool:  
        size: 4  
      thread-name-prefix: scheduling-  

静态资源缓存策略

SpringBoot默认不为静态资源设置HTTP缓存头,浏览器每次都会重新请求CSS、JS、图片等静态文件,影响页面加载性能。

spring:  
  web:  
    resources:  
      cache:  
        cachecontrol:  
          max-age: 365d  
          cache-public: true  
      chain:  
        strategy:  
          content:  
            enabled: true  
            paths: /**  
        cache: true  
      static-locations: classpath:/static/  

开启内容版本化策略后,SpringBoot会根据文件内容生成MD5哈希值作为版本号,文件名变成style-abc123.css这样的格式。当文件内容发生变化时,哈希值也会变化,浏览器会认为这是新文件重新下载;如果文件没变化,浏览器就直接使用缓存,有效提升页面加载速度。

数据库事务超时

@Transactional注解默认没有设置超时时间,长时间运行的事务会一直持有数据库锁,影响其他操作的执行。

@Transactional(timeout = 30, rollbackFor = Exception.class)  
public void batchProcess(List<Data> dataList) {  
    // 分批处理,避免长事务  
    int batchSize = 100;  
    for (int i = 0; i < dataList.size(); i += batchSize) {  
        List<Data> batch = dataList.subList(i,  
            Math.min(i + batchSize, dataList.size()));  
        processBatch(batch);  
    }  
}