golang mysql 的 packet sequence error 这个错

时间:2022-06-30 19:19:44

  在公司用golang 写了个插入外链数据的服务,这服务是2016年写的,大概作用就是,python 爬取的数据,要同步到 wordpress中,golang就负责,将数据整理,图片下载弄到 wordpress中,当然也不止这些服务,本来这个服务之前运行的好好的,可是最近又上了新的数据采集道后,这个服务就显得不稳定了,后台日志,经常报

packet sequence error

这个错,纠缠了很久,一直找不到原因,在github上面发现原来作者也有这个坑 https://github.com/ziutek/mymysql/issues/105

其实,这个错,报的就是一个多协程(线程)的问题,其实说来也怪,我们最近有几个项目都用golang写的就从来没有报过这个错,为啥这个就报这个错,反复的review 代码

var db *mysql.DB //定义了全局的db

func init() {
db, _ = MysqlConn.Get().(*mysql.DB) //封装的线程池里拿
}

目前就感觉这个是有点毛病,好好看了下golang 的init函数

1.初始化不能采用初始化表达式初始化的变量。
2.程序运行前的注册。
3.实现sync.Once功能。
4.其他

肯定这个初始化的时候不能写到 init中,于是换了个写法

func GetDB() *mysql.DB {
return MysqlConn.Get().(*mysql.DB)
}

直接通过调用GetDB()获取数据的链接,然后再操作,观查了一下午,暂时没有报这个错