MySQL 默认连接数
一、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 |
验证方法:
SHOW VARIABLES LIKE 'max_connections';
三、核心概念与命令详解
1. 查看当前连接数与配置
- 最大连接数:
SHOW VARIABLES LIKE 'max_connections';
- 当前活跃连接数:
SHOW STATUS LIKE 'Threads_connected';
- 连接使用率:
SELECT (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. 详细连接信息
- 查看所有连接状态:
SHOW PROCESSLIST;
- 按用户分组统计连接数:
SELECT user, COUNT(*) AS connections FROM information_schema.processlist GROUP BY user;
- 空闲连接数:
SELECT COUNT(*) FROM information_schema.processlist WHERE command = 'Sleep';
四、连接数调整的实战方法
1. 通过配置文件永久修改
-
Linux/Unix/macOS:
修改/etc/my.cnf
或/etc/mysql/my.cnf
[mysqld] max_connections = 1000 wait_timeout = 300 interactive_timeout = 300
-
Windows:
修改安装目录下的my.ini
[mysqld] max_connections = 1000 wait_timeout = 300
-
重启服务:
# Linux/Unix/macOS sudo systemctl restart mysql# Windows net stop MySQL80 && net start MySQL80
2. 动态调整(临时生效)
SET GLOBAL max_connections = 1000;
五、连接池优化:HikariCP 的 YML 配置详解
在 Spring Boot 项目中,HikariCP 是默认的连接池实现。以下是一个完整的 application.yml
配置示例:
spring:datasource:url: jdbc:mysql://localhost:3306/mydbusername: rootpassword: passwordhikari:# 最大连接数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
rules: - pattern: "com.zaxxer.hikari<type=Pool>(?<poolName>[^:]+):(?<attributeName>.+)"name: "hikaricp_${poolName}_${attributeName}"type: GAUGEhelp: "Metrics from HikariCP connection pool"
-
启动应用时加载 JMX Exporter
java -javaagent:/path/to/jmx_prometheus_javaagent.jar=12345:/path/to/jmx_config.yaml -jar your-app.jar
-
Prometheus 配置抓取目标
scrape_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
配置:ulimit -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'; | 查看空闲连接 |