目录
database/sql的SetMax的总结
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