学习笔记-too many connections报错

文章描述了一个在使用德鲁伊数据库连接池与远程MySQL数据库交互时遇到的问题,即频繁获取新连接导致TooManyConnections错误。作者检查并确认已关闭连接,但连接池并未重用休眠连接。提出的解决方案是增大数据库的最大连接数或缩短最大睡眠时间。然而,这些仅是临时措施,未能充分利用连接池。作者寻求根本解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

起因:

使用德鲁伊数据库连接池且远程连接了同一个局域网下其他mysql数据库,使用几次获取连接的代码之后报错:too many connections

过程:

开始我认为是没有关闭数据库连接导致出现这个情况,但通过多次核查确认了已关闭数据库连接,后续通过在mysql命令行窗口输入以下代码查看到了当前数据库连接数时发现确实已关闭该连接,当前处于休眠状态。

#查看当前数据库连接池连接信息:

show full processlist 

但是当我重新获取连接时会重新开辟新的连接,而没有调用数据库连接池中的连接,由此一来,在多次调用数据库连接后连接池和数据库直接回产生很多连接,如下图所示:

通过show varialbles like "max_connections"命令可以查看出数据库默认的最大连接数为151,如下图所示。

  当连接数超过151时再获取连接会如下错误

 java.sql.SQLNonTransientConnectionException: Data source rejected establishment of connection,  message from server: "Too many connections"

解决方法:

通过造成问题的原因,有两种解决方法

方法一:增大数据库连接数

由于数据库默认的最大连接数是151,当我们超过151个连接时,就会造成异常,我们可以更改数据库的最大连接数,使用命令set global max_connections=1000,将数据库的最大连接数更改为1000,由此数据库的最大连接量便扩大成了1000,暂时不会出现too many connections报错。

方法二:缩短最大睡眠时间

通过show global variables like "wait_timeout"命令可以查看当前数据库的最大睡眠时间,数据库默认是8小时,可以使用set global wait_timeout=60,将数据库的最大睡眠时间更改为1分钟,这样超过一分钟没使用的数据库连接就会自动关闭了。

小结:

在远程连接同一个局域网下其他mysql数据库,使用德鲁伊数据库连接池获取连接时,无法正常启用数据库连接池中的连接,每一次都是获取到新的连接。

而使用Connection的close()方法只是关闭了实现类和连接池中的连接,当并未真正的关闭连接池和数据库之间的连接,当我们需要获取新的连接时可以直接从数据库连接池中获取连接,不用获取重新向数据库获取连接。

使用这两个方法可以暂时解决“too many connections” 的问题,但感觉治标不治本,导致这个问题的根本原因是获取连接时,无法使用已休眠的连接,而是每次都获取新的连接导致的,通过以上方法虽能解决问题,但无法发挥出使用数据库连接池的优势。如有大神知道如何从根本上解决问题,望请赐教!

### MySQL 'Too many connections' 错误解决方案 #### 修改最大连接数配置 对于遇到 `Too many connections` 错误的情况,可以通过调整 MySQL 配置中的最大连接数来解决问题。具体操作如下: - 对于通过 Docker 创建的 MySQL 容器,在启动容器时可以指定环境变量 `MYSQL_MAX_CONNECTIONS` 来设定最大连接数量[^2]。 ```bash docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_MAX_CONNECTIONS=500 -d mysql:tag ``` - 或者编辑 MySQL 的配置文件 `my.cnf` 或 `my.ini` 文件,找到 `[mysqld]` 节点下增加或修改 `max_connections` 参数至合适的数值[^5]。 ```ini [mysqld] max_connections = 500 ``` 之后重启 MySQL 服务使更改生效。 #### 查看当前最大连接数 为了确认当前系统的最大连接数设置情况,可以在 MySQL 命令行工具中执行命令: ```sql SHOW VARIABLES LIKE 'max_connections'; ``` 这有助于评估是否有必要进一步调高此参数值[^4]。 #### 断开闲置连接以释放资源 当存在大量未关闭的闲置连接时,这些连接不仅占用服务器资源还可能导致新的合法请求无法建立新连接。因此定期清理不再使用的连接非常重要。可通过以下 SQL 查询获取长时间处于非活动状态的进程列表,并终止它们: ```sql SELECT ID, USER, HOST, DB, COMMAND, TIME FROM information_schema.PROCESSLIST WHERE TIME > 3600; KILL QUERY process_id; -- 替换process_id为实际要结束的任务ID ``` 上述语句用于查找超过一小时无动作的会话并将其杀死,以此方式主动管理连接池大小从而预防因过度累积造成的性能瓶颈问题[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值