更好的 Golang 的 MongoDB 驱动 `globalsign/mgo`

SpikeQin · · 875 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

用 1.3 版本使用 Go 开始,连接 MongoDB 使用的驱动中,最常见的就是:mgo.v2

这个库一度是唯一的选择,它的接口设计合理,与 Golang/MongoDB/bson 适配的也做的不错。然而这个库长期处于无人看管的状态,有一大堆让人难以忍受 bug,其中我们遇到的就有不少:

  1. 当短时间执行大量 db 操作把并发执行的与 MongoDB 的连接池增大之后,多余的连接没有被正确的回收掉(即便设置了 maxIdleTimeoutminPoolSize)。
  2. 执行 bulk 操作的 size 是固定不可配置的。

在我们的线上项目中,偶尔的业务峰值会照成某几个服务短时间大量的 db 操作,而一旦这些 db 操作带来的连接数量被撑大之后,耗尽 db 的连接数资源之后。其他的服务就无法连接到此 db 了( lass 的云服务器供应商提供的 MongoDB 实例的连接数都不高)。

后来终于有人受不了了:

globalsign/mgo

新的 MongoDB 驱动,不仅修复了 mgo.v2 可怕的连接池问题,还带来的很多非常棒的特性:

  • 各种 go 的原生数据结构 (例如time.Duration)到 bson 的序列化支持。
  • 可以使用数字作为 map 的 key 了。
  • 使用 sync.Pool 提高了 bson 序列化的性能,参见这里

剩下的各种 bug 修复和改进可以参考该项目的 github 主页,改进点非常多,强烈建议替换掉 mgo.v2

各位使用 MongoDB 时遇到 marshal/unmarshal 的时候可以留一下
一些小问题


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:SpikeQin

查看原文:更好的 Golang 的 MongoDB 驱动 `globalsign/mgo`

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

875 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传