使用JPA Hibernate操作PostgreSQL为何出现大量空闲数据库会话
空闲会话产生原因
- 这是JDBC连接池的正常机制,默认情况下Spring Boot + JPA Hibernate组合会内置Hikari连接池,它的默认
minimum-idle配置值就是10,即连接池会始终维持至少10个可用的空闲连接,你看到的标记为"PostgreSQL JDBC Driver"的会话就是这些由连接池维护的连接。pgAdmin中统计的11个会话里,多出来的1个是你登录pgAdmin本身产生的会话。 - 连接池维护空闲连接的目的是降低请求处理的性能损耗:如果每次业务请求(GET/POST/PUT)都要重新创建数据库连接、用完再销毁,会产生大量的TCP握手、认证、资源释放开销,提前留存空闲连接可以让请求直接拿可用连接使用,用完归还到连接池即可,不需要关闭。
- 这些会话处于空闲状态,说明当前没有业务请求在占用连接,属于正常待机状态。
是否需要清理这些会话
- 业务运行无异常的前提下完全不需要手动清理。10个空闲连接对PostgreSQL来说资源占用极低,默认配置下PostgreSQL单实例可以轻松支撑上百个空闲连接,不会对性能产生影响。
- 不要直接在pgAdmin中手动kill这些空闲会话:连接池会自动检测到连接失效,立刻重新创建新的连接补够最小空闲数,反而会产生不必要的资源消耗。
- 如果你确实有调整需求,可以修改连接池配置,以下是Spring Boot环境下的配置示例:
# 调整最小空闲连接数,可根据实际业务并发量下调 spring.datasource.hikari.minimum-idle=2 # 空闲连接超时时间,超过该时长无使用的空闲连接会被释放,单位毫秒,示例为10分钟 spring.datasource.hikari.idle-timeout=600000 # 连接池最大连接数上限,单实例应用一般不超过20即可满足需求 spring.datasource.hikari.maximum-pool-size=10
- 只有出现以下场景才需要针对性处理:数据库总连接数接近
max_connections上限(PostgreSQL默认值为100)、连接池出现泄漏导致空闲连接数持续上涨不回落、应用多实例部署后总连接数超过数据库承载能力。
内容的提问来源于stack exchange,提问作者galeotron
相关产品推荐
相关产品推荐

