go连接数据库

选择 _ "github.com/go-sql-driver/mysql" 驱动连接数据库,重点关注以下四个参数:

1
2
3
4
maxOpen    // 使用 SetMaxOpenConns 函数进行配置
maxIdleCount // 使用 SetMaxIdleConns 函数进行配置
maxLifetime // 使用 SetConnMaxLifetime 函数进行配置
maxIdleTime // 使用 SetConnMaxIdleTime 函数进行配置
  • maxOpen

    可以支持的最大并发连接(会话):这个值可以设置的大一些,只要不超过 my.cnf 中max-connections即可,默认 0 表示不限制

    假设 maxOpen 设置为 4,如果同时来了 5 个连接,就只能先处理 4 个,剩下 1 个在排队。

    多说一句,所谓的排队等,本质上就是先(在一个 map 里)登记一下,然后守着一个 chanel 等,等正在运行的请求结束了,开始收尾了,再去 map 里查看这个请求,并往 chanel 塞上一个连接。

  • maxIdleConut

    连接池大小:最多可以存储多少连接(会话),连接池中的连接即为长连接,设置值<=0 表示不存储连接

    一个数据库操作完成后,会将连接(会话)放到连接池中;如果连接满了没有位置了,就直接关闭该连接,该连接就是短链接

  • maxLifetime

    连接的存活时间:注意和 my.cnf 中wait-timeout的区别,前者是存活时间,从该连接被创建起开始计算,不管你状态,时间到了就关闭;后者则是计算连接的 idle 时间,只有长时间处于空闲状态才会被关闭。

    一个连接有 idle 以及 open 两种状态,一个长期处于 idle 的连接,MySQL 服务器就会想要关掉它。

  • maxIdleTime

    空闲(idle)连接的存活时间:该值和 my.cnf 中wait-timeout表示的意义一致。

如何设置?

理想的情况:尽量使用长连接,避免使用短链接

目前:峰值并发 100,日常 20-50

1
2
3
4
DB.SetMaxOpenConns(100)
DB.SetMaxIdleConns(50)
// DB.SetConnMaxLifetime() // 无所谓,可以不设置
DB.SetConnMaxIdleTime(2 * time.Hour) // 这个要设置,只要比wait-time小就行