go连接数据库

本文最后更新于:2023年12月5日 晚上

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

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 服务器就会想要关掉它。

    默认值为零,这意味着连接不会被客户端主动关闭。但是,建议设置,以避免连接泄漏和其他问题。

    根据经验,应该设置为小于my.cnfwait_timeout 值。这可确保在服务器终止连接之前关闭连接。

    如果不设置,当连接的时间超过wait_timeout,mysql会主动关闭,然后报错:bad connection

  • maxIdleTime

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

如何设置?

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

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

DB.SetMaxOpenConns(100)
DB.SetMaxIdleConns(50)
DB.SetConnMaxLifetime()      // 这个要设置,理论上小于 活跃时间+wait-time 就行,但通常设置比wait-time小
DB.SetConnMaxIdleTime(2 * time.Hour)  // 这个要设置,只要比wait-time小就行

go连接数据库
http://blog.lujinkai.cn/Golang/go连接数据库/
作者
像方便面一样的男子
发布于
2022年1月25日
更新于
2023年12月5日
许可协议