一尘不染

gopkg.in/mgo.v2中的并发(Mongo,Go)

go

我希望在用Go编写的webapp中使用MongoDB。

我可以mgo.Session同时在Web应用程序中使用它吗?例如在http.Handler

或者我应该叫Session.CopySession.Close- >会议的化妆池。

在我读到某个池已经在其中实现mgo.Session,我可以同时使用会话以及在其他地方读到我需要Copy和的地方,这听起来很矛盾Close


阅读 612

收藏
2020-07-02

共1个答案

一尘不染

mgo.Session是同时使用安全。引用其文档:

所有Session方法都是并发安全的,可以从多个goroutine中调用。

但这并不意味着您不应该通过在拨号时获得的初始会话上调用Session.Copy()或来并行创建和使用更多它们Session.Clone()

并发安全并从中使用更多好处不会 彼此排斥 (它们不是 互斥的
)。虽然你可以使用一个单一mgo.Session的够程的任意数,不会很好地扩展,将无法形成规模 ,在所有
。会话会自动管理一个连接池,甚至可能管理到多个服务器节点的连接,但是如果您使用的是单个Session,则不会利用这一点。通过Session在每个请求的开始处创建一个新请求(如果需要),并在结束时适当关闭它(使用Session.Close();最好使用来调用defer),您正在利用可能同时使用多个连接(可能与多个服务器节点(如果有)的连接)的优势,从而更好地利用服务器资源;并获得更快的响应时间(从数据库,最终到HTTP最终用户)。调用Session.Close()不会关闭与服务器的基础连接,它只会将连接放回池中,以供其他会话使用。

2020-07-02