我应该如何使用mgo.v2处理会话的创建和处理?

时间:2017-07-18 06:32:31

标签: mongodb go mgo

我正在将golang webservice连接到MongoDB数据库。我对创建和存储数据库会话的最佳和最安全的方式有点困惑。在其他语言中,我习惯于一种方法,我可以打开和关闭每个请求的连接,如(伪代码)

conn = db.newConnection()
query = conn.query({id: 'my-id'})
conn.close()

这将确保连接始终正确关闭并释放资源。只要有连接打嗝,它就会暂时受到影响。由于数据库针对此类行为进行了大量优化,因此不会出现性能命中。

现在,mgo docs on Dial()(用于建立连接)状态:

  

对于给定的群集,此方法通常只调用一次。进一步   然后使用New或者建立到同一群集的会话   在获得的会话上复制方法。这将使他们分享   底层集群,并适当地管理连接池。

这导致我在包init上创建了一个包级别连接,然后由所有实例化客户端共享:

var database *mgo.Database
// Setup runs all the needed steps to establish a database connection
func Setup() error {
    var sessionErr error
    mongoSession, sessionErr = mgo.Dial(os.Getenv("MONGO_HOST"))
    if sessionErr != nil {
        return sessionErr
    }
    database = mongoSession.DB(os.Getenv("DB_NAME"))
    return nil
}

这样做很好,但我遇到的问题是,大约每月一次,与数据库的连接丢失,并且在流程的生命周期内无法恢复(使所有请求返回EOF并要求某人重启过程)。我从未见过使用上面描述的connect-and-close-on-each-query方法。

我很确定我一定做错了,但我觉得我正在做文档告诉我的事情,我在网上找到的所有例子都是一次性的事情,不包括长期的情况。运行应用程序。

使用mgo在长期运行的应用程序中以故障安全方式处理Mongo连接的推荐方法是什么?是否存在使用文档中提到的Copy()New()的既定模式?使用它们会阻止连接永久失败吗?

0 个答案:

没有答案