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不会自动替换它。
可能的原因及验证方式:
Hibernate的连接管理机制
Hibernate对JDBC连接有一层封装,hibernate.connection.release_mode配置决定了连接的释放时机:- 若配置为
after_transaction或on_close,连接不会立即关闭,会被Hibernate暂时持有以复用;当新请求到来时,Hibernate会复用现有连接,多余连接才会被关闭。 - 验证:将该配置改为
after_statement,查询完成后连接会立即关闭,观察连接是否还会保持。
- 若配置为
Druid数据库端的连接复用
Druid数据库可能开启了TCP连接复用或连接保活机制,即使客户端关闭连接,数据库端可能会将连接保持一段时间,等待新请求复用。你看到的TCP连接可能是数据库端的闲置连接,而非客户端持有。- 验证:通过数据库命令(如MySQL的
show processlist)查看连接状态,确认连接归属及状态。
- 验证:通过数据库命令(如MySQL的
代码中连接未正确关闭
若代码中未通过try-with-resources或显式调用close()方法关闭Connection、Statement或ResultSet,JDBC驱动可能不会立即释放物理连接,导致连接长时间保持。- 验证:检查代码中的资源释放逻辑,确保连接使用后被正确关闭,观察连接是否立即释放。
内容的提问来源于stack exchange,提问作者Carl

