golang的database/sql的SetMaxXXX详解
SetMaxxxx的设置
golang的mysql参数详解
SetMaxOpenConns 允许最大打开的连接数
- 默认值为0,没有限制,包含正在使用的连接和连接池中的连接,如果连接数超过
SetMaxOpenConns则阻塞, - 注意这个值的设置不能超过 mysql的设置的最大连接数如果超过则会报错, Error 1040: Too many connections ,所以要设置合理
- 查看mysql的最大连接数
show variables like '%max_connections%'; - 设置mysql的最大连接数 set GLOBAL max_connections = xxx;
SetMaxIdleConns 连接池的最大空闲数连接
- 默认是2(database/sql中),如果设置
小于等于0,则maxIdle=-1则每次都会创建的新的连接,而不会复用连接 - 从空闲池中获取连接时,会判断连接创建时间是否过期maxLifeTime,如果过期了则关闭连接
SetConnMaxLifetime 连接池的连接最大生存时间
-
在创建连接时如果不设置则连接不会做过期检查,但是这个设置也要结合 mysql的设置的
wait_timeout, -
wait_timeout的作用是,设置非交互连接(就是指那些连接池方式、非客户端方式连接的)的超时时间,默认是28800,就是8小时,超过这个时间, mysql服务器会主动切断那些已经连接的,会创建一个新的连接
-
实操mysql的time_out的设置
| - | - |
|---|---|
| A clien | B client |
| set session wait_timeout = 30; | - |
| - | show procelist 存在进程 A:53039,B:53057 |
| 等待30s | - |
| - | show procelist 存在进程 B:53057 |
| show tables; ERROR 2013 (HY000): Lost connection to MySQL server during query 再次执行命令会试着创建一个新的链接 | - |
| - | show processlist 存在进程 B:53057,A:53066 |
疑惑
为什么创建db后,要先ping一下
db.Ping()
- sql.Open()时,只是初始化了一个sql.Db的一个对象,并没有开始建立连接
- 数据库的连接建立的是惰性的
- db.Ping()的作用是 验证新建的sql.Db对象是否能正常连接数据库
如何证明连接池的存在
- 代码实操
func main() {
//....
db.SetMaxOpenConns(10)
db.SetMaxIdleConns(5)
for i := 1; i < 100; i++ {
go func() {
getConnId()
}()
}
//阻塞程序,然后观察msyql的连接情况 show processlist
select {}
}
//证明连接池的存在
func getConnId() {
ssql := " select CONNECTION_ID()"
var connectionId int64
if err := db.QueryRow(ssql).Scan(&connectionId); err != nil {
log.Println(err)
}
log.Println(connectionId)
}
// 根据打印的结果,你会发现有一些重复的 connectionId
- 观察mysql的连接进程 show processlist
-- 可以看到 id 12~17 这5个mysql的连接和 代码中设置 db.SetMaxIdleConns(5)一致,
show processlist;
+----+-----------------+-----------------+---------+---------+--------+------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+-----------------+---------+---------+--------+------------------------+------------------+
| 4 | event_scheduler | localhost | NULL | Daemon | 100503 | Waiting on empty queue | NULL |
| 12 | root | localhost:53400 | db_test | Sleep | 44 | | NULL |
| 14 | root | localhost:53397 | db_test | Sleep | 44 | | NULL |
| 15 | root | localhost:53404 | db_test | Sleep | 44 | | NULL |
| 16 | root | localhost:53399 | db_test | Sleep | 44 | | NULL |
| 17 | root | localhost:53405 | db_test | Sleep | 44 | | NULL |
| 19 | root | localhost | db_test | Query | 0 | starting | show processlist |
+----+-----------------+-----------------+---------+---------+--------+------------------------+------------------+
学到了什么
mysql的wait_timeout和max_connections
- wait_timeout 设置非交互的连接存活时间
- max_connections 设置mysql允许的最大连接数,超过则报错,SetMaxOpenConns不能超过 mysql的max_connections
- setXXX的参数的作用
灵感
为什么会突然研究这个
- 项目中设置 setMaxxxxx,当时也不太懂设置的参数的意思