Spring+MyBatis+MariaDB报Too many connections但数据库连接未满
报错排查:Too many connections但数据库连接未占满的原因(Spring+MyBatis+MariaDB)
应用程序抛出如下错误:
Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Too many connections但数据库实际连接并未占满,使用技术栈为Spring + MyBatis + MariaDB,以下是可能的问题原因:
可能的原因分析
1. 用户级连接数配额耗尽
数据库全局连接数未达上限,但当前应用使用的数据库用户被设置了单独的连接数限制,已经达到配额。可以通过MariaDB命令验证:
-- 查看用户权限及连接数限制 SHOW GRANTS FOR '你的用户名'@'客户端IP'; SELECT user, host, max_connections FROM mysql.user WHERE user='你的用户名';
2. 连接泄漏未释放
- 代码中存在连接未正确关闭的情况:比如手动获取JDBC连接后未在finally块中关闭,或者MyBatis的SqlSession未通过try-with-resources方式管理,导致连接长期占用。
- Spring事务配置异常:事务传播属性设置不当(如
PROPAGATION_REQUIRES_NEW滥用),导致大量连接被事务长时间持有无法回收。
3. 连接池参数配置不合理
- 连接池的
maxTotal(最大连接数)设置超过了数据库给当前用户的连接配额,或超出数据库实际可承载的连接数(注意区分全局max_connections和用户级限制)。 minIdle、maxIdle等参数配置失衡,导致连接池持续持有大量闲置连接,无法有效回收复用。
4. 连接有效性检测失效
- 连接池的
validationQuery配置错误或未启用,无法检测出数据库端已关闭的无效连接,这些无效连接被连接池持续占用,新请求无法获取可用连接。 - 数据库的
wait_timeout、interactive_timeout设置与连接池的超时参数不匹配,数据库主动关闭闲置连接后,连接池未及时清理,请求时触发报错。
5. 多数据源/连接池实例冲突
如果应用中配置了多个数据源或连接池实例,每个实例都会占用部分用户连接配额,总和可能达到用户连接数上限,而你查看的仅为单个实例的连接数,因此误以为未占满。
内容的提问来源于stack exchange,提问作者김보성
相关产品推荐
相关产品推荐

