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

Mongodb 对例程的查询会产生巨大的堆栈跟踪

Mongodb 对例程的查询会产生巨大的堆栈跟踪

Go
慕村225694 2021-11-15 17:09:30
我在 go 程序中对 api 进行了大量网络调用,结果存储在数据库中(使用 mgo)。api 调用是在单独的 go 例程上完成的。在其他例程中,我会在更新数据库之前从数据库中提取信息并对其进行处理。当数据被放回时,一个标志被设置,以便知道该数据已被后处理,因此当程序要求数据库提供另一个条目以进行后处理时,数据库将标志complete设置为false。当标志设置为true,则走常规关机:wg.done()。一切都很好,我有很多打印输出告诉我程序是如何运行的,但是在运行结束时,我得到了一个巨大的堆栈跟踪,其中包含许多相同的内容:goroutine 56731 [sleep]: time.Sleep(0x12a05f200) /usr/local/Cellar/go/1.5/libexec/src/runtime/time.go:59 +0xf9 gopkg.in/mgo%2ev2.(*mongoServer).pinger (0xc82601b420, 0x1) /Users/alex/go/src/gopkg.in/mgo.v2/server.go:295 +0x1b4 由 gopkg.in/mgo%2ev2.newServer /Users/alex/go/src/gopkg 创建.in/mgo.v2/server.go:88 +0x162goroutine 56698 [sleep]: time.Sleep(0x12a05f200) /usr/local/Cellar/go/1.5/libexec/src/runtime/time.go:59 +0xf9 gopkg.in/mgo%2ev2.(*mongoServer).pinger (0xc82601bce0, 0x1) /Users/alex/go/src/gopkg.in/mgo.v2/server.go:295 +0x1b4 由 gopkg.in/mgo%2ev2.newServer /Users/alex/go/src/gopkg 创建.in/mgo.v2/server.go:88 +0x162goroutine 56699 [sleep]: time.Sleep(0x1dcd6500) /usr/local/Cellar/go/1.5/libexec/src/runtime/time.go:59 +0xf9 gopkg.in/mgo%2ev2.(*mongoCluster).syncServersLoop (0xc8256425a0) /Users/alex/go/src/gopkg.in/mgo.v2/cluster.go:353 +0x2b1 由 gopkg.in/mgo%2ev2.newCluster /Users/alex/go/src/gopkg.in 创建/mgo.v2/cluster.go:73 +0x1a0goroutine 56738 [sleep]: time.Sleep(0x12a05f200) /usr/local/Cellar/go/1.5/libexec/src/runtime/time.go:59 +0xf9 gopkg.in/mgo%2ev2.(*mongoServer).pinger (0xc82606fa40, 0x1) /Users/alex/go/src/gopkg.in/mgo.v2/server.go:295 +0x1b4 创建的 gopkg.in/mgo%2ev2.newServer /Users/alex/go/src/gopkg .in/mgo.v2/server.go:88 +0x162我正在努力弄清楚它告诉我什么,它是否锁定写入数据库,例程是否没有关闭以及某些东西是否超时,我不知道。顺便说一句,我正在使用 go 1.5。
查看完整描述

1 回答

?
拉莫斯之舞

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

看起来引用的逻辑每次需要用它做某事时都会拨打 MongoDB,这不是在 HTTP 服务器中保持持续数据库通信的合适方法。

每次Dial使用 MongoDB 服务器(或副本集或 mongos)时,都会启动一些后台活动,以保持集群拓扑在内存中保持最新,并保持连接池正常(请注意,在此之后创建的所有会话单个Dial调用将共享一个连接池)。

Dial每次想要与数据库交谈时都调用意味着每个拨号的所有逻辑都变得独立,并且在最后一个会话关闭后,后台活动可能需要一段时间才能关闭。

因此,即使它可以工作,它也非常低效,因为它必须再次了解正在使用的拓扑,它无法使用来自现有池的连接,并且还会产生不必要的背景流失,这正是您在回溯中观察到的。


查看完整回答
反对 回复 2021-11-15
  • 1 回答
  • 0 关注
  • 214 浏览
慕课专栏
更多

添加回答

举报

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