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

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,提问作者김보성

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 01:06:26