R2DBC连接池未复用MySQL连接?Spring应用异常问题咨询
R2DBC MySQL连接复用异常:连接ID暴涨、CPU占用高问题分析
核心结论
这种用完连接就关闭、不回池复用的情况,基本都是连接池配置错误或使用方式不当,而非R2DBC的有意设计——R2DBC本身支持连接池复用,官方提供的r2dbc-pool就是专门做连接池管理的组件,正常配置下会自动复用连接。
排查步骤
1. 确认连接池依赖是否正确引入
别只引入MySQL的R2DBC驱动,必须搭配连接池依赖,否则每次数据库操作都会新建连接:
<!-- Maven 依赖示例 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-r2dbc</artifactId> </dependency> <dependency> <groupId>io.r2dbc</groupId> <artifactId>r2dbc-pool</artifactId> </dependency> <dependency> <groupId>dev.miku</groupId> <artifactId>r2dbc-mysql</artifactId> </dependency>
如果缺少r2dbc-pool,Spring会默认使用非池化连接,直接导致连接ID暴涨。
2. 检查连接池配置是否生效
查看application.yml或application.properties,确保连接池已开启:
spring: r2dbc: url: r2dbc:mysql://localhost:3306/your_db username: root password: xxx pool: enabled: true # 关键配置,必须设为true initial-size: 5 max-size: 20 max-idle-time: 30m
若未开启enabled: true,即使加了连接池依赖,依然会使用非池化连接,频繁创建销毁。
3. 排查代码中的连接使用逻辑
- 避免手动创建
ConnectionFactory获取连接后调用Connection.close()——连接池会自动管理连接回收,手动关闭会直接销毁连接而非放回池内。 - 确保所有数据库操作都通过Spring Data R2DBC的
Repository或DatabaseClient执行,不要自己实现连接管理逻辑。 - 检查事务配置:比如事务超时时间过短、事务未正常提交/回滚,都可能导致连接被异常销毁。
4. 尝试升级MySQL R2DBC驱动
部分旧版本的r2dbc-mysql驱动存在连接池适配bug,可能导致连接无法正常回池,建议升级到最新稳定版(如0.8.x系列,适配MySQL 8.0+)。
关于“unauthenticated user”的说明
SHOW PROCESSLIST中出现的该状态,是MySQL正在处理新连接的认证流程,频繁出现直接对应连接未被复用的问题——正常复用连接的场景下,不会产生大量这类进程。
内容的提问来源于stack exchange,提问作者youngminz
相关产品推荐
相关产品推荐

