You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DriverManagerDataSource出现连接池现象的来源排查求助

关于DriverManagerDataSource与连接池行为的疑问

问题背景

  • 技术栈:Spring Boot + Hibernate + Druid数据库,手动通过DriverManagerDataSource创建dataSource实例
  • 异常表现:官方文档明确DriverManagerDataSource无完善连接池实现,但并发10个虚拟用户时,出现10个已建立的TCP连接;查询完成后连接仍保持,仅当1个虚拟用户发起新查询后才降至1个,表现出连接池特性
  • 验证结果:通过测试方法确认当前数据源实例为org.springframework.jdbc.datasource.DriverManagerDataSource@xxxx
  • 日志线索:启动日志显示Tomcat服务及Servlet引擎启动:

    [30m2024-03-12 10:03:27,567[0;39m [34mINFO [0;39m [[34mmain[0;39m] [33morg.apache.juli.logging.DirectJDKLog[0;39m [,] - Starting service [Tomcat]
    [30m2024-03-12 10:03:27,568[0;39m [34mINFO [0;39m [[34mmain[0;39m] [33morg.apache.juli.logging.DirectJDKLog[0;39m [,] - Starting Servlet engine: [Apache Tomcat/9.0.86];

  • 疑问:是否是Tomcat JDBC连接池自动生效了?

解答

DriverManagerDataSource本身确实没有连接池功能,它每次调用getConnection()都会新建物理连接,且不会复用或管理连接。你看到的连接保持行为,并非Tomcat JDBC连接池自动生效——因为你已显式指定DriverManagerDataSource作为数据源,Spring Boot不会自动替换它。

可能的原因及验证方式:

  1. Hibernate的连接管理机制
    Hibernate对JDBC连接有一层封装,hibernate.connection.release_mode配置决定了连接的释放时机:

    • 若配置为after_transaction或on_close,连接不会立即关闭,会被Hibernate暂时持有以复用;当新请求到来时,Hibernate会复用现有连接,多余连接才会被关闭。
    • 验证:将该配置改为after_statement,查询完成后连接会立即关闭,观察连接是否还会保持。
  2. Druid数据库端的连接复用
    Druid数据库可能开启了TCP连接复用或连接保活机制,即使客户端关闭连接,数据库端可能会将连接保持一段时间,等待新请求复用。你看到的TCP连接可能是数据库端的闲置连接,而非客户端持有。

    • 验证:通过数据库命令(如MySQL的show processlist)查看连接状态,确认连接归属及状态。
  3. 代码中连接未正确关闭
    若代码中未通过try-with-resources或显式调用close()方法关闭Connection、Statement或ResultSet,JDBC驱动可能不会立即释放物理连接,导致连接长时间保持。

    • 验证:检查代码中的资源释放逻辑,确保连接使用后被正确关闭,观察连接是否立即释放。

内容的提问来源于stack exchange,提问作者Carl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 04:10:27