全网详述Mysql查看连接总数、活跃数、最大并发数,以及show status和show global status区别,show status like ‘%变量名%‘;

1. 文章引言


我们在工作的过程中,经常会遇到的Too many connections的错误。

也许,这个错误是在Java代码中出现的,如下代码所示:

java.sql.SQLNonTransientConnectionException: Data source rejected establishment of connection,  message from server: "Too many connections"
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110)
	at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
	at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:833)
	at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:453)
	at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246)
	at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198)
	at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1643)
	at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1709)
	at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:2813)

又或许,这个错误是由MySQL报出的,如下图所示:

在这里插入图片描述

又或者,这个错误由其他语言报出,比如golang、Python,PHP等等。

但不论是哪种语言报出的这个错误,我们都需要了解MySQL的连接数机制,包括如下才能准确无误地解决这个错误,即Too many connections

接下来,我便从连接总数、连接活跃数、最大并发数详细说明MySQL的连接数。

2. MySQL连接数

2.1 连接总数


我们可以执行如下命令,来查看MySQL的连接总数:

mysql> show status like  'Threads%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 4     |
| Threads_connected | 6     |
| Threads_created   | 264   |
| Threads_running   | 1     |
+-------------------+-------+
4 rows in set (0.00 sec)

当然,我们也可以使用如下代码,查看全局的连接数量:

mysql> show global status like  'Threads%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 10    |
| Threads_connected | 16    |
| Threads_created   | 286   |
| Threads_running   | 2     |
+-------------------+-------+
4 rows in set (0.00 sec)

MySQL的连接总数主要看Threads_connected的值,这个表示打开的连接数,也就是连接总数。

Threads_connectedshow processlist结果相同,表示当前连接总数,如下代码所示:

mysql> show processlist;
+-----+------+-----------------+---------+---------+------+----------+------------------+
| Id  | User | Host            | db      | Command | Time | State    | Info             |
+-----+------+-----------------+---------+---------+------+----------+------------------+
| 588 | root | localhost:52547 | test | Sleep   | 6715 |          | NULL             |
| 589 | root | localhost:52548 | test | Sleep   | 6715 |          | NULL             |
| 590 | root | localhost:52549 | test | Sleep   | 6715 |          | NULL             |
| 591 | root | localhost:52550 | test | Sleep   | 6715 |          | NULL             |
| 592 | root | localhost:52551 | test | Sleep   | 6711 |          | NULL             |
| 594 | root | localhost:55797 | NULL    | Query   |    0 | starting | show processlist |
+-----+------+-----------------+---------+---------+------+----------+------------------+
6 rows in set (0.00 sec)

Threads_connected的值为6,而show processlist查出6条数据。

因而,Threads_connectedshow processlist结果相同。

2.2 活跃数


活跃数可以看上述查询结果中的Threads_running的值。

Threads_running 数值指的是激活的连接数,这个数值一般远低于Threads_connected数值。

准确的来说,Threads_running是代表当前并发数,上述当前并发数为1。

另外Threads_cachedThreads_created分别表示:

  1. Threads_cachedMySQL管理的线程池中还有多少可以被复用的资源。

  2. Threads_created:表示创建过的线程数。

如果发现Threads_created值过大的话,表明MySQL服务器一直在创建线程,这也是比较耗资源。可以适当增加配置文件中的thread_cache_size值,如下代码所示:

mysql> set global thread_cache_size=60;
Query OK, 0 rows affected (0.00 sec)

2.3 最大并发数


查询数据库当前设置的最大连接数,如下代码所示:

mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 151   |
+-----------------+-------+
1 row in set, 1 warning (0.04 sec)

MySQL默认最大连接数max_connections151,其实MySQL还给root留了多一个通道,真正的最大连接数为max_connections + 1

但实际工作中因为各种原因,这个1也有可能被占用。

这时,我们无法通过登录MySQL调整参数的方法来处理这个错误。

当然,我们可按如下命令修改最大连接数:

mysql> set GLOBAL max_connections=1000;
Query OK, 0 rows affected (0.04 sec)

重新查询最大连接数,来校验是否设置成功:

mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 1000  |
+-----------------+-------+
1 row in set, 1 warning (0.01 sec)

但是,这只是临时修改,重启mysql会失效。

因而,需要修改mysql的配置/etc/my.cnf,如下图所示:

在这里插入图片描述

修改完毕后,重启mysql5.7即可:

在这里插入图片描述

3. 重要补充

3.1 show status和show global status区别

  1. show status:本次会话的参数状态

  2. show global status:本次MYSQL服务到现在总请求数,即systemctl start mariadb到现在的总请求,可以使用systemctl restart mariadb重置该数值。

3.2 show status like ‘%变量名%’


变量名如下:

  1. Aborted_clients:由于客户没有正确关闭连接已经死掉,已经放弃的连接数量。

  2. Aborted_connects:尝试已经失败的MySQL服务器的连接的次数。

  3. Connections:试图连接MySQL服务器的次数。

  4. Created_tmp_tables:当执行语句时,已经被创造了的隐含临时表的数量。

  5. Delayed_insert_threads:正在使用的延迟插入处理器线程的数量。

  6. Delayed_writes:用INSERT DELAYED写入的行数。

  7. Delayed_errors:用INSERT DELAYED写入的发生某些错误(可能重复键值)的行数。

  8. Flush_commands:执行FLUSH命令的次数。

  9. Handler_delete:请求从一张表中删除行的次数。

  10. Handler_read_first:请求读入表中第一行的次数。

  11. Handler_read_key:请求数字基于键读行。

  12. Handler_read_next:请求读入基于一个键的一行的次数。

  13. Handler_read_rnd:请求读入基于一个固定位置的一行的次数。

  14. Handler_update:请求更新表中一行的次数。

  15. Handler_write:请求向表中插入一行的次数。

  16. Key_blocks_used:用于关键字缓存的块的数量。

  17. Key_read_requests:请求从缓存读入一个键值的次数。

  18. Key_reads:从磁盘物理读入一个键值的次数。

  19. Key_write_requests:请求将一个关键字块写入缓存次数。

  20. Key_writes:将一个键值块物理写入磁盘的次数。

  21. Max_used_connections:同时使用的连接的最大数目。

  22. Not_flushed_key_blocks:在键缓存中已经改变但是还没被清空到磁盘上的键块。

  23. Not_flushed_delayed_rows:在INSERT DELAY队列中等待写入的行的数量。

  24. Open_tables:打开表的数量。

  25. Open_files:打开文件的数量。

  26. Open_streams 打开流的数量(主要用于日志记载)

  27. Opened_tables 已经打开的表的数量。

  28. Questions 发往服务器的查询的数量。

  29. Slow_queries 要花超过long_query_time时间的查询数量。

  30. Threads_connected 当前打开的连接的数量。

  31. Threads_running 不在睡眠的线程数量。

  32. Uptime 服务器工作了多长时间,单位秒。

3.3 show variables like ‘xxx’


show variables like xxx常见的查询,可以参考这篇博文:全网详细介绍MySQL中的show variables like xxx 详解

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
A*算法是一种启发式搜索算法,可以用于解决最短路径问题。它以启发式函数为辅助,通过评估每个节点到目标节点的距离来指导搜索方向,从而提高搜索效率。以下是A*算法的具体原理。 1. 初始化:将起始点加入开放列表,并将其估计值(启发式函数)f设为0。 2. 搜索过程:从开放列表中选取f值最小的节点进行扩展。将该节点从开放列表中删除,并将其加入到关闭列表中。对于该节点的相邻节点,如果相邻节点不在关闭列表中,则将其加入开放列表,并计算它的f值(启发式函数),同时记录该节点的父节点。 3. 判断终点:重复执行第2步,直到终点被加入到关闭列表中或者开放列表为空。 4. 搜索成功:如果终点被加入到关闭列表中,搜索成功,通过回溯每个节点的父节点,得到从起始点到终点的最短路径。 以下是A*算法的伪代码: ``` 1. Put the starting node s on a list called the open list. 2. Set the f-value of s to 0. 3. 4. while the open list is not empty: 5. Select the node n with the lowest f-value from the open list. 6. Remove n from the open list and add it to the closed list. 7. if n is the goal node: 8. return the path from s to n. 9. 10. for each successor of n: 11. if successor is not in the closed list: 12. if successor is not in the open list: 13. add successor to the open list. 14. set the f-value of successor to f(n) + g(n, successor). 15. set the parent of successor to n. 16. else if the f-value of n + g(n, successor) is less than the f-value of successor: 17. update the f-value of successor to f(n) + g(n, successor). 18. set the parent of successor to n. 19. 20. return "no path exists". ``` 其中,f(n)表示节点n的估价函数值,g(n, successor)表示从节点n到successor的实际代价。 以下是一个简单的例子,说明如何使用A*算法找到从源节点s到目标节点t的最短路径。 假设有以下有向图: ![A*算法示例图](https://i.imgur.com/w0YBmJj.png) 我们要找到从源节点s到目标节点t的最短路径。 1. 初始化:将起始节点s加入到开放列表,将f(s)设为0。 2. 第一轮扩展:从开放列表中选取f值最小的节点s进行扩展。将s从开放列表中删除,并将其加入到关闭列表中。对于s的相邻节点a和b,计算它们的f值,并记录它们的父节点为s,并将它们加入到开放列表中。 ``` f(a) = g(s, a) + h(a, t) = 3 + 2 = 5 f(b) = g(s, b) + h(b, t) = 2 + 4 = 6 ``` 此时开放列表为[a, b],关闭列表为[s]。 3. 第二轮扩展:从开放列表中选取f值最小的节点a进行扩展。将a从开放列表中删除,并将其加入到关闭列表中。对于a的相邻节点c和d,计算它们的f值,并记录它们的父节点为a,并将它们加入到开放列表中。 ``` f(c) = g(a, c) + h(c, t) = 1 + 3 = 4 f(d) = g(a, d) + h(d, t) = 3 + 2 = 5 ``` 此时开放列表为[b, c, d],关闭列表为[s, a]。 4. 第三轮扩展:从开放列表中选取f值最小的节点c进行扩展。将c从开放列表中删除,并将其加入到关闭列表中。对于c的相邻节点t,计算它的f值,并记录它的父节点为c,并将其加入到开放列表中。 ``` f(t) = g(c, t) + h(t, t) = 2 + 0 = 2 ``` 此时开放列表为[b, d, t],关闭列表为[s, a, c]。 5. 第四轮扩展:从开放列表中选取f值最小的节点t进行扩展。将t从开放列表中删除,并将其加入到关闭列表中。搜索成功,通过回溯每个节点的父节点,得到从起始点s到目标节点t的最短路径为s->a->d->t。 6. 搜索成功,得到最短路径为s->a->d->t。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

互联网全栈开发实战

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值