一、MySQL 默认连接数概述
MySQL 的 max_connections
是数据库服务器允许的最大并发连接数,直接影响系统性能和资源利用率。
二、MySQL 默认连接数的版本差异
版本 | 默认最大连接数 | 上限值 |
---|---|---|
MySQL 5.0 | 100 | 16384 |
MySQL 5.1 | 200(小版本不同) | 100000 |
MySQL 5.5/5.6/5.7 | 151 | 100000 |
MySQL 8.0 | 151 | 100000 |
验证方法:
sqlSHOW VARIABLES LIKE 'max_connections';
三、核心概念与命令详解
1. 查看当前连接数与配置
-
最大连接数 :
sqlSHOW VARIABLES LIKE 'max_connections';
-
当前活跃连接数 :
sqlSHOW STATUS LIKE 'Threads_connected';
-
连接使用率 :
sqlSELECT (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Threads_connected') AS current_connections, (SELECT VARIABLE_VALUE FROM performance_schema.global_variables WHERE VARIABLE_NAME = 'max_connections') AS max_connections, ROUND( (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Threads_connected') / (SELECT VARIABLE_VALUE FROM performance_schema.global_variables WHERE VARIABLE_NAME = 'max_connections') * 100, 2 ) AS connection_usage_rate;
2. 详细连接信息
-
查看所有连接状态 :
sqlSHOW PROCESSLIST;
-
按用户分组统计连接数 :
sqlSELECT user, COUNT(*) AS connections FROM information_schema.processlist GROUP BY user;
-
空闲连接数 :
sqlSELECT COUNT(*) FROM information_schema.processlist WHERE command = 'Sleep';
四、连接数调整的实战方法
1. 通过配置文件永久修改
-
Linux/Unix/macOS :
修改
/etc/my.cnf
或/etc/mysql/my.cnf
ini[mysqld] max_connections = 1000 wait_timeout = 300 interactive_timeout = 300
-
Windows :
修改安装目录下的
my.ini
ini[mysqld] max_connections = 1000 wait_timeout = 300
-
重启服务:
bash# Linux/Unix/macOS sudo systemctl restart mysql # Windows net stop MySQL80 && net start MySQL80
2. 动态调整(临时生效)
sql
SET GLOBAL max_connections = 1000;
五、连接池优化:HikariCP 的 YML 配置详解
在 Spring Boot 项目中,HikariCP 是默认的连接池实现。以下是一个完整的 application.yml
配置示例:
yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: password
hikari:
# 最大连接数
maximum-pool-size: 20
# 最小空闲连接
minimum-idle: 5
# 连接超时时间(毫秒)
connection-timeout: 30000
# 空闲连接超时时间(毫秒)
idle-timeout: 600000
# 连接最大存活时间(毫秒)
max-lifetime: 1800000
# 连接健康检查
connection-test-query: SELECT 1
# 预热连接数
initialization-fail-timeout: 1
# 自动提交
auto-commit: true
# 池大小调整的等待时间(毫秒)
pool-name: MyHikariPool
3. 关键参数说明
参数名 | 说明 | 推荐值 |
---|---|---|
maximum-pool-size |
最大连接数 | 20~100(业务决定) |
minimum-idle |
最小空闲连接数 | 5~10 |
connection-timeout |
连接超时时间(毫秒) | 30000 |
idle-timeout |
空闲连接超时时间(毫秒) | 600000 |
max-lifetime |
连接最大存活时间(毫秒) | 1800000 |
connection-test-query |
健康检查 SQL | SELECT 1 |
六、连接池监控与 Prometheus 集成
1. 通过 JMX Exporter 监控 HikariCP
配置步骤:
-
下载 JMX Exporter
从 JMX Exporter GitHub 下载
jmx_prometheus_javaagent-*.jar
。 -
创建配置文件
jmx_config.yaml
yamlrules: - pattern: "com.zaxxer.hikari<type=Pool>(?<poolName>[^:]+):(?<attributeName>.+)" name: "hikaricp_${poolName}_${attributeName}" type: GAUGE help: "Metrics from HikariCP connection pool"
-
启动应用时加载 JMX Exporter
bashjava -javaagent:/path/to/jmx_prometheus_javaagent.jar=12345:/path/to/jmx_config.yaml -jar your-app.jar
-
Prometheus 配置抓取目标
yamlscrape_configs: - job_name: 'hikaricp' static_configs: - targets: ['localhost:12345']
2. Grafana 面板指标
- 活跃连接数 :
hikaricp_HikariPool_activeConnections
- 空闲连接数 :
hikaricp_HikariPool_idleConnections
- 等待线程数 :
hikaricp_HikariPool_threadsAwaitingConnection
- 总连接数 :
hikaricp_HikariPool_totalConnections
七、高并发场景下的连接管理策略
1. Web 应用场景
- 问题:高并发下连接数耗尽。
- 解决方案 :
- 连接池 + 缓存:减少直接数据库访问(如 Redis 缓存高频数据)。
- 读写分离:通过主从复制分担写压力。
- 异步任务:复杂操作通过队列(如 Kafka)异步处理。
2. 数据分析场景
- 需求:短时间大量复杂查询。
- 优化策略 :
- 限制单次查询连接数 :设置
max_connections_per_hour
。 - 批处理:合并多个查询为批量操作。
- 限制单次查询连接数 :设置
八、常见问题与解决方案
1. 错误:Too many connections
- 原因 :达到
max_connections
限制。 - 解决方法 :
- 增加
max_connections
。 - 优化连接池配置(减少空闲连接)。
- 使用连接池 + 异步处理。
- 增加
2. 连接泄漏
- 现象:连接未释放导致资源浪费。
- 解决方案 :
- 代码规范 :使用
try-with-resources
自动关闭资源。 - 设置超时 :合理配置
wait_timeout
和idle-timeout
。
- 代码规范 :使用
九、扩展知识:MySQL 连接数调优
1. 资源限制检查
-
内存消耗 :每个连接需分配线程和缓存,增加
max_connections
会显著增加内存占用。 -
操作系统限制 :检查
ulimit
配置:bashulimit -n # 查看当前限制 ulimit -n 65535 # 临时修改限制
2. 连接池性能调优
- 预热连接:启动时预先创建部分连接,减少首次请求延迟。
- 动态扩容:根据负载动态调整连接池大小(需结合监控系统)。
十、总结
1. 总结
- 默认值:MySQL 5.5+ 默认为 151,需根据业务需求调整。
- 调整方法:优先通过配置文件修改,结合 HikariCP 优化。
- 监控 :定期检查
Threads_connected
和SHOW PROCESSLIST
。
2. Java 开发最佳实践
- 连接池配置:使用 YML 格式统一管理,避免硬编码。
- 资源管理 :使用
try-with-resources
自动关闭连接。 - 监控集成:通过 Prometheus + Grafana 实时监控连接池状态。
十一、附录:常用命令速查表
命令 | 功能 |
---|---|
SHOW VARIABLES LIKE 'max_connections'; |
查看最大连接数配置 |
SHOW STATUS LIKE 'Threads_connected'; |
查看当前活跃连接数 |
SHOW PROCESSLIST; |
查看所有连接的详细信息 |
SET GLOBAL max_connections = 1000; |
临时调整最大连接数 |
SELECT * FROM information_schema.processlist WHERE command = 'Sleep'; |
查看空闲连接 |