为何Spring Boot+Hibernate应用会生成大量Session Metrics日志?
Hibernate Session Metrics日志大量生成的原因与处理方案
原因分析
- Hibernate统计功能(
hibernate.generate_statistics=true)的触发逻辑是只要完成Session的生命周期(创建到关闭),就会输出Session Metrics日志,和是否执行数据库操作无关。 - 关闭
open-in-view后,Spring不会再为整个请求周期绑定Session,但静态资源请求若经过Spring的DispatcherServlet,可能被某些组件(如Spring Data JPA自动配置、全局拦截器、AOP切面)触发Session创建,哪怕没有实际数据库交互。 - Hibernate 6默认的统计日志粒度较细,空Session(未执行SQL)的生命周期结束后,依然会输出Metrics信息。
处理措施
根据实际需求选择对应方案:
- 调整日志级别过滤:若只关注有SQL执行的统计,可将Hibernate统计日志级别调至
WARN或ERROR,在application.properties中配置:
这样空Session的Metrics会被过滤,仅输出异常或关键统计信息。logging.level.org.hibernate.stat=WARN - 按需开启统计功能:仅在调试、性能分析阶段开启统计,生产环境直接关闭
hibernate.generate_statistics=true。 - 排查Session触发源:通过日志栈跟踪或调试工具定位无意义Session的创建来源,比如不必要的拦截器、AOP逻辑,针对性禁用或调整相关配置,从根源减少空Session的生成。
- 自定义统计输出:若需保留统计但过滤空Session日志,可自定义Hibernate的
StatisticsLogger,实现对无SQL执行的Session统计信息的过滤,适合有定制需求的场景。
内容的提问来源于stack exchange,提问作者Slevin
相关产品推荐
相关产品推荐

