使用 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
查看相关:
我正在使用 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
查看相关: