使用 mongo.Connect 时连接未打开,而是在我进行查询时打开

Connection is not open when use mongo.Connect instead it does when I do the query

我正在使用 mongo-驱动程序编写一个 Go 应用程序以连接到 mongo 副本集。

我注意到 mongo.Connect 实际上没有连接到数据库。

即使我关闭了 mongod 实例,mongo.Connect 仍然可以通过。

但是,当我进行查询时,它将连接到 mongod 实例。

现在我的问题是我对同一个 mongod 实例中的不同数据库有很多 (>100) 个并发查询。

驱动程序创建了一大堆连接,但 mongod 让我失败了 Too many files opened 因为连接太多,即使我使用一个 mongo.Client.

这是 mongo_driver 的正确行为吗?我该如何处理?

MongoDB 是否需要每个数据库的每个连接?

mongo.Connect() creates a new mongo.Client 并对其进行初始化,但不会(必须)创建与数据库服务器的连接。

要实际创建连接并检查服务器是否可达(无需执行查询),您可以使用 Client.Ping() 方法。如果无法访问服务器,这将 return 出错。

官方 mongodb 驱动程序管理一个内部连接池。连接在使用后不会立即关闭,而是将它们放回池中,因此当需要连接来执行操作时,可以立即使用池中的空闲连接。这是预期的行为。您可以通过传递给 mongo.Connect().

options.ClientOptions 配置其大小

参见ClientOptions.SetMaxPoolSize():

SetMaxPoolSize specifies that maximum number of connections allowed in the driver's connection pool to each server. Requests to a server will block if this maximum is reached. This can also be set through the "maxPoolSize" URI option (e.g. "maxPoolSize=100"). The default is 100. If this is 0, it will be set to math.MaxInt64.

设置连接受限的客户端并对其执行 ping 操作的示例:

ctx := context.Background()

opts := options.Client().
    ApplyURI("mongodb://localhost").
    SetMaxPoolSize(20) // Allow no more than 20 connections per server

client, err := mongo.Connect(ctx, opts)
if err != nil {
    log.Printf("mongo.Connect() failed: %v", err)
    return
}
defer client.Disconnect(ctx)

if err := client.Ping(ctx, nil); err != nil {
    log.Printf("Can't connect to db: %v", err)
    return
}

// Use client

查看相关: