在公司用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()获取数据的链接,然后再操作,观查了一下午,暂时没有报这个错