启动日志里的 open-in-view 警告到底在警告什么?为什么「查询早就结束了」连接还没还?关了会出什么问题?连接池小的时候它会把吞吐拖低多少?这篇在 Spring Boot 4.0.8、HikariCP、MySQL 上用 2 个连接的池实测。
启动日志里的 open-in-view 警告:LOG WARN o.s.b.j.a.JpaBaseConfiguration$JpaWebConfiguration - spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning GET /probe?ms=600 → 查库之前活动连接=0,repo.findById 返回之后=1,再睡 600 ms 之后=1 显式写 spring.jpa.open-in-view=true:启动日志里的警告条数 0 GET /probe?ms=600 → 查库之前活动连接=0,repo.findById 返回之后=1,再睡 600 ms 之后=1 spring.jpa.open-in-view=false:启动日志里的警告条数 0 GET /probe?ms=600 → 查库之前活动连接=0,repo.findById 返回之后=0,再睡 600 ms 之后=0
打开时连接从第一次查询持有到请求结束;关闭后事务一结束就还给池。
open-in-view=true:GET /lazy → HTTP 200 books.size()=3
日志里的异常行:(没有)
open-in-view=false:GET /lazy → HTTP 500 {"timestamp":"2026-10-20T03:34:17.434Z","status":500,"error":"Internal Server Error","path":"/lazy"}
日志里的异常行:LOG ERROR o.a.c.c.C.[.[.[/].[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.hibernate.LazyInitializationException: Cannot lazily initi打开时控制器里能访问懒加载集合;关闭后抛 LazyInitializationException。
open-in-view=true:成功 60 个(7.5 个/秒),失败 17 个 {'500': 17};成功请求的延迟 p50 1225 ms、p99 1267 ms
服务端日志里的一行:LOG WARN org.hibernate.orm.jdbc.error - HikariPool-1 - Connection is not available, request timed out after 1005ms (total=2, active=2, idle=0, waiting=7)
open-in-view=false:成功 270 个(33.8 个/秒),失败 0 个 ;成功请求的延迟 p50 307 ms、p99 313 ms池小时打开会让连接成为瓶颈:吞吐低约 4.5 倍,还有 HTTP 500。