八年前Meta就有万亿参数模型了。但Spring Boot的默认配置,直到今天还在假装你的服务器资源无限。

我在Lakaut AC担任架构师,负责核心系统Lakaut Hub——一个真实的数字证书认证平台,有真实的流量,真实的日志,真实的崩溃。不是什么教程里的Hello World。

打开网易新闻 查看精彩图片

官方文档展示的永远是空无一人的售票处。但生产环境是Soda Stereo演唱会开场前的那一刻:300人同时涌向入口,系统没坏,只是从来没被设计成能扛住这种峰值。

打开网易新闻 查看精彩图片

被忽视的WARN日志

应用启动时,控制台有一条警告我忽略了数周:

spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering.

open-in-view=true是默认设置。这意味着Hibernate会话在整个HTTP请求周期内保持打开——从请求进入,到业务逻辑、验证、JSON序列化全部完成。任何不需要数据库的操作,都在占用连接池。

我用Actuator在Lakaut Hub实测:一个执行多次JPA查询的端点,每个请求从进入到响应完成全程占用池连接。50并发峰值时,连接获取超时。不是Bug,是默认配置的代价。

打开网易新闻 查看精彩图片

修复只需要一行,理解需要一整个下午

application.yml修改:

spring.jpa.open-in-view: false

连接在数据库操作结束后立即归还。配合Hikari调参:maximum-pool-size 10(不超过Railway套餐上限),minimum-idle 5(避免冷启动),connection-timeout 20000ms,idle-timeout 5分钟,max-lifetime 20分钟。

我的结论不舒服但真实:Spring Boot的默认配置为本地开发优化,在PaaS真实生产环境配合JVM调优和PostgreSQL高负载下,这些默认值会烧毁你。我有日志证明。