急冲冲完成的mysql的一个监控自动处理程序上线了,线下处理是正常的,没想到线上才半小时就奔溃了。mysql
如今时间是晚上11点,心慌焦虑涌上心头,须要熬夜?肾上腺素激增。c++
程序主要是一个定时任务的处理程序,主要是对mysql 的处理,初看没啥问题,操做语句都是网上搬下来的,检查了下代码,golang
奔溃都在什么rows.close,stmt.close,还有query这时候,非法defer,这个奔溃的最屡次,还都是内存指针异常。。。 golang这调试,说实在连c++都不如,在可能我还用不惯吧,我用的是liteidesql
随便截取段代码:服务器
rows, err := db.Query("select * from user;") if err != nil { log.Fatal(err) } defer rows.Close()
基本上网上大部分都是这种状况,rows.close,stmt.close 等都有,可是惟独没有db.close。为何? 他们说有ide
Db.SetMaxOpenConns(200) Db.SetMaxIdleConns(100) Db.Ping()
线程池。全部代码中都说不须要close,可是那是有条件的。测试
咱们查看官方的解释线程
// It is rare to Close a DB, as the DB handle is meant to be
// long-lived and shared between many goroutines.
但在实际使用中,都说了是定时任务天然是go func的,而后使用一个公共的Db,还有一个注意的问题,虽然链接放进链接池,可是服务器依然会单方面断开一个的链接。指针
关键是并且使用Db.Ping()依然不能解决这个问题,缘由没细查。调试
如今知道了缘由,解决起来就容易多了,结尾必定加
Db.Close()
什么rows.close,stmt.close反而不重要,后面测试发现无关紧要,凌晨1点了,收工。