zoukankan      html  css  js  c++  java
  • 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并没有被释放(资源回收)

    这是很基础的错误,不该出现的错误。

  • 相关阅读:
    vs中无法找到头文件
    c++ vector 用法
    c++ queue 用法
    c++ 中 毫秒级时间获取
    vs2013 boost signals
    vs2013环境下boost配置
    C++ static 用法
    fopen()和fclose()
    删除字符串尾的回车符
    WaitForSingleObject()
  • 原文地址:https://www.cnblogs.com/zihunqingxin/p/5085925.html
Copyright © 2011-2022 走看看