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

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

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

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

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

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

驱动程序创建了一大堆连接并且因为连接太多而使mongod我失败,即使我使用单个.Too many files openedmongo.Client

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

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


不负相思意
浏览 125回答 1
1回答

慕妹3146593

mongo.Connect()创建一个新的mongo.Client并初始化它,但不(必然)创建到数据库服务器的连接。要实际创建连接并检查服务器是否可访问(不执行查询),您可以使用该Client.Ping()方法。如果服务器不可访问,这将返回错误。官方的 mongodb 驱动程序管理一个内部连接池。连接在使用后不会立即关闭,而是将它们放回池中,因此当需要连接来执行操作时,可以立即使用池中的空闲连接。这是预期的行为。您可以通过options.ClientOptions传递给mongo.Connect().见ClientOptions.SetMaxPoolSize():SetMaxPoolSize 指定驱动程序的连接池中允许到每个服务器的最大连接数。如果达到此最大值,对服务器的请求将被阻止。这也可以通过“maxPoolSize” URI 选项进行设置(例如“maxPoolSize=100”)。默认值为 100。如果为 0,则设置为 math.MaxInt64。示例设置连接受限的客户端并对其执行 ping 操作:ctx := context.Background()opts := options.Client().    ApplyURI("mongodb://localhost").    SetMaxPoolSize(20) // Allow no more than 20 connections per serverclient, 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见相关:goroutine create multiple mongodb connection
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go