go连接数据库
本文最后更新于:2023年12月5日 晚上
选择 _ "github.com/go-sql-driver/mysql"
驱动连接数据库,重点关注以下四个参数:
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.cnf
的wait_timeout
值。这可确保在服务器终止连接之前关闭连接。如果不设置,当连接的时间超过
wait_timeout
,mysql会主动关闭,然后报错:bad connection
maxIdleTime
空闲(idle)连接的存活时间:该值和 my.cnf 中
wait-timeout
表示的意义一致。
如何设置?
理想的情况:尽量使用长连接,避免使用短链接
目前:峰值并发 100,日常 20-50