在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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并没有被释放(资源回收) 这是很基础的错误,不该出现的错误。 |
请发表评论