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);
    }
}