golang的database/sql的SetMaxxxx

目录

  • database/sql的SetMax的总结
    • setMaxxxx的设置
      • golang的mysql参数详解
    • 疑惑
      • 为什么创建db后,要先ping一下
      • 如何证明连接池的存在
    • 学到了什么
      • mysql的wait_timeout和max_connections
    • 灵感
      • 为什么会突然研究这个

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.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,当时也不太懂设置的参数的意思

你可能感兴趣的:(golang,数据库)