我正在将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()
的既定模式?使用它们会阻止连接永久失败吗?