首页
学习
活动
专区
圈层
工具
发布

Spring Boot号称"零配置",但上线前不改这5项默认配置,十有八九会在生产环境踩坑——轻则响应慢,重则磁盘爆满或内存泄漏

这不是经验之谈,是多个技术社区高频踩坑清单的汇总。我帮你整理好了,直接拿去用。

■ 01 数据库连接池:默认值只够本地跑

参数

spring.datasource.hikari.maximum-pool-size

默认值

10(条连接)

高并发下,10条连接很快就会被占满,后续请求排队等待。

此外,还有一个隐藏风险:

参数

spring.datasource.hikari.leak-detection-threshold

默认值

0(不检测连接泄漏)

连接泄漏是最难排查的生产问题之一,泄漏超过10分钟才会被发现。

建议:生产环境根据数据库实际承载能力调高连接数,同时开启泄漏检测(建议设置为60000ms,即1分钟)。

■ 02 异步任务线程池:每执行一次就创建一个新线程

默认行为

使用 SimpleAsyncTaskExecutor

没有线程池复用机制。每调用一次异步方法,就新建一条线程。高并发下,CPU上下文切换暴增,内存直接打满。

这是Spring Boot里最容易被忽视的生产隐患之一,因为本地测试时流量小,根本看不出来。

正确做法:在启动类或配置类里定义线程池,并手动指定 @Async 使用这个线程池:

@Bean

public TaskExecutor taskExecutor() {

ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

executor.setCorePoolSize(5);

executor.setMaxPoolSize(20);

executor.setQueueCapacity(100);

return executor;

}

■ 03 文件上传限制:默认只允许1MB

参数

spring.servlet.multipart.max-file-size

1MB

参数

spring.servlet.multipart.max-request-size

10MB

用户传个头像、文档就直接报413错误,你还不知道为什么。

建议:根据业务实际需求设置上限,并在前端做文件大小提示:

spring.servlet.multipart.max-file-size=10MB

spring.servlet.multipart.max-request-size=50MB

■ 04 缓存配置:用ConcurrentHashMap,没有过期机制

参数

spring.cache.type

Simple(ConcurrentHashMap实现)

无过期策略、无大小限制。缓存数据持续累积,最终OOM。

这是最容易在流量稍大的项目里引爆的配置问题。

建议:生产环境使用Redis作为缓存,或者至少换成有容量限制的实现:

spring.cache.type=redis

spring.cache.redis.time-to-live=3600000(1小时过期)

■ 05 Jackson时区:序列化日期时会坑你

参数

spring.jackson.time-zone

系统默认时区

分布式部署时,多台服务器时区不一致,同一个时间戳在不同节点解析出来差了8小时。

建议:统一设置为Asia/Shanghai,一行配置解决问题:

spring.jackson.time-zone=Asia/Shanghai

spring.jackson.date-format=yyyy-MM-dd HH:mm:ss

■ 快速检查清单

上线前,对照检查这5项是否已修改:

● HikariCP连接池 根据并发量调高了吗?

● 泄漏检测 开启了吗?

● @Async线程池 配了复用线程池吗?

● 文件上传限制 够用吗?

● 缓存类型 是Simple还是Redis?

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OubYhIdlHb7Su6576fkLWPOw0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。
领券