我如何知道一个 mgo 会话是不是已关闭
Posted
技术标签:
【中文标题】我如何知道一个 mgo 会话是不是已关闭【英文标题】:How can I know if a mgo session is closed我如何知道一个 mgo 会话是否已关闭 【发布时间】:2019-03-21 19:41:21 【问题描述】:我在 Go 中使用 MongoDB 驱动程序 labix_mgo
的 *mgo.Session
,但是我不知道会话是否已关闭。当我使用关闭会话时,会引发运行时错误。如果我知道会话已关闭,我想跳过会话副本。
【问题讨论】:
【参考方案1】:首先,您正在使用的mgo
驱动程序:gopkg.in/mgo.v2
(托管在https://github.com/go-mgo/mgo)不再维护。请改用社区支持的 fork github.com/globalsign/mgo
,它具有向后兼容的 API。
mgo.Session
不提供检测它是否已关闭的方法(使用其Session.Close()
方法)。
但您不应依赖其他人关闭您正在使用的会话。 获取会话的代码应该负责关闭它。遵循这个简单的原则,你就不会遇到使用关闭会话的问题。
例如,如果我们以Web服务器为例,在请求的开头使用Session.Copy()
(或Session.Clone()
)获取会话,并在同一个处理程序中关闭会话(最好使用defer), 在同一个函数中。只需将此会话传递给任何需要它的人。他们不必关闭它,也不必关闭,这是创建它的函数的责任。
【讨论】:
mgo 提供Session.Ping 来测试会话中连接是否可用。 @Adrian 是的,但是Ping()
是为了检查连接性,asker 想检测之前是否调用过Session.Close()
。如果是的话,引用其文档:“在会话关闭后使用它是一个运行时错误。” 所以Session.Ping()
应该(可能)也恐慌。以上是关于我如何知道一个 mgo 会话是不是已关闭的主要内容,如果未能解决你的问题,请参考以下文章