go的mgo,连接未释放问题,连接泄露。
api启动几天后,卡住(连接失败,超时)
异常原因
mongo连接被占满,无法建立mgo连接,返回信息
查询点用端口可知,97%的连接被api项目占用。
api项目的mongodb连接“泄露”,某处的连接没有断开,不断累加。
排查出问题来源。
简单代码示例(这代码有,没有错误检测,也不会编译成功,知道意思即可)
func demo() { session, collection, err := GetCollection(DBNAME, COLLECTIONNAME) defer session.Close() }
第一次初始session对象,这个session对象是A
demo方法执行完毕会调用 session.Close()将A的mongodb连接释放掉。
func demo() { session, collection, err := GetCollection(DBNAME, COLLECTIONNAME) defer session.Close() session, collection, err = GetCollection(DBNAME, COLLECTIONNAME) }
这样便会出现连接“泄露”。
因为初始化了另一个sesseion对象B
demo执行到第三句是,session的引用指向了对象B,而对象A的引用则丢失了,A成了野对象。
demo执行完毕后,session.Close()释放了B的mongodb连接,但是A对象引用已经丢失,A的mongodb连接,永远不会得到释放。
垃圾回收可以把野对象回收了(内存回收),但是野对象所对应的socket并没有被释放(资源回收)
这是很基础的错误,不该出现的错误。