我如何知道一个 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 会话是不是已关闭的主要内容,如果未能解决你的问题,请参考以下文章

如何知道数据是不是已更改 [关闭]

如何在 Codeigniter 中检查是不是设置了会话?

如何使用连接池将我的 mgo 会话转换为 mongo-go-driver 客户端?

维护 mgo 会话的最佳实践

如何知道一个人是不是离开了您的网站?

即使不为空,Mgo 也会忽略字段