这不是经验之谈,是多个技术社区高频踩坑清单的汇总。我帮你整理好了,直接拿去用。
■ 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?