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

Max*_*Max 8 go mongodb mgo

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

我可以拥有一个mgo.Session并在Web应用程序中同时使用它.例如inhttp.Handler

或者我应该打电话Session.CopySession.Close- >制作会话池.

这听起来很矛盾,我读到池已经在里面实现了mgo.Session,我可以同时使用会话,在其他地方,我读到我需要CopyClose.

icz*_*cza 6

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

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

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

并发安全并且从使用更多它们中受益并不相互排斥(它们不是相互排斥的).虽然你可以使用一个单一mgo.Session的够程的任意数,不会很好地扩展,将无法形成规模,在所有.会话自动管理连接池,甚至可以管理多个服务器节点,但如果您使用单个连接Session,则不会利用它.通过Session在每个请求的开头创建一个新的(如果需要),并在最后正确地关闭它(使用Session.Close();最好是使用defer),您可以利用可能同时使用多个连接,可能是多个服务器节点(如果可用),从而更好地利用服务器资源; 并获得更快的响应时间(从数据库,最终到您的HTTP最终用户).调用Session.Close()不关闭与服务器的底层连接,它只是将连接放回池中,准备被另一个会话拾取.

另请参阅有关使用Sessions的相关问题:mgo - 查询性能似乎一直很慢(500-650ms)