Go mgo 包中的连接池

Posted

技术标签:

【中文标题】Go mgo 包中的连接池【英文标题】:Connections pool in Go mgo package 【发布时间】:2014-06-07 01:44:57 【问题描述】:

在running-mongodb-queries-concurrently-with-go 的文章中说 mgo.DialWithInfo :创建一个会话来维护与 MongoDB 的套接字连接池,但是当我在函数 DialWithInfo 的 documentacion 中查找时,我没有找到这样的东西谈谈池连接,只有我在Dial Function Dial Function 中找到了一些内容:对于给定的集群,此方法通常只调用一次。然后在获得的会话上使用 New 或 Copy 方法建立到同一集群的更多会话。这将使它们共享底层集群,并适当地管理连接池。

有人能告诉我 MGO 上的池连接是如何工作的吗?是否可以设置这个池? 是真的 DialWithInfo 创建了一个池连接还是只有 Dial 函数创建了这个池?

提前致谢

【问题讨论】:

【参考方案1】:

查看source code for the Dial function calls,可以看到Dial函数调用了DialWithTimeout函数,后者又调用了DialWithInfo函数。因此,要回答您关于函数之间差异的问题,似乎DialDialWithTimeout 的便利包装器,而后者又是DialWithInfo 的便利包装器,因此它们会产生相同的连接池。

至于如何管理该连接池,您的问题已经解决了。

然后在获得的会话上使用 New 或 Copy 方法建立到同一集群的更多会话。这将使它们共享底层集群,并适当地管理连接池。

所以单次调用DialDialWithTimeoutDialWithInfo 将建立连接池,如果您需要多个会话,请使用session.New()session.Copy() 方法从返回的会话中获取它从您选择使用的任何拨号功能。

【讨论】:

但是,应该使用.Copy(),因为它保留了身份验证(如果适用)。

以上是关于Go mgo 包中的连接池的主要内容,如果未能解决你的问题,请参考以下文章

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

MongoDB Golang驱动mgo的连接池使用问题

Go:数据库连接池

Golang MongoDB 连接池缺陷及修复

使用Go实现一个数据库连接池

Go 连接池的设计与实现