为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
不负相思意 2022-10-17 19:35:13
我正在编写一个使用 mongo-driver 连接到 mongo 副本集的 Go 应用程序。我注意到mongo.Connect实际上并没有连接到数据库。即使我关闭了mongod实例,mongo.Connect仍然可以通过。但是,当我进行查询时,它将连接到mongod实例。现在我的问题是我对同一mongod实例中的不同数据库有很多(> 100)并发查询。驱动程序创建了一大堆连接并且因为连接太多而使mongod我失败,即使我使用单个.Too many files openedmongo.Client这是 mongo_driver 的正确行为吗?我该如何处理?MongoDB 是否需要每个数据库的每个连接?
查看完整描述

1 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

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 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

见相关:goroutine create multiple mongodb connection


查看完整回答
反对 回复 2022-10-17
  • 1 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信