nodejs 连接 mongodb 正确的姿势是什么?现在 mongo 经常挂掉

2019-08-12 22:02:04 +08:00
 rizon

nodejs 连接的 mongodb 方式是用完就关

MongoClient.connect(DB_CONN, {useNewUrlParser: true}, function (err, db) {
        if (err) throw err;
        db.db(DB_DB).collection(DB_COL).replaceOne(
            {title: where.getTitle(), $or: [{...}, {...}]},
            data,
            {upsert: true},
            callback);
        db.close();
    });

然后最近发现 mongodb 的容器经常挂掉,好像是连接太多的原因?接口的读写的确会很频繁。 所以想问下是不是这样写不行?是不是应该用连接池来写?那么 nodejs 里面怎么写 mongo 的连接池啊,能麻烦给个例子吗。

日志:

[ftdc] serverStatus was very slow: { after basic: 286, after asserts: 690, after backgroundFlushing: 690, after connections: 690, after dur: 690, after extra_info: 783, after freeMonitoring: 876, after globalLock: 876, after locks: 876, after logicalSessionRecordCache: 876, after network: 876, after opLatencies: 990, after opcounters: 990, after opcountersRepl: 990, after repl: 990, after security: 990, after storageEngine: 990, after tcmalloc: 990, after transactions: 990, after wiredTiger: 990, at end: 1001 }

日志也不懂什么意思,能给解释一下吗?这里的 after 什么意思?

2390 次点击
所在节点    程序员
11 条回复
leven87
2019-08-12 22:11:05 +08:00
我是用 mongoose 连接的,暂时还没处理大量连接的问题
leven87
2019-08-12 22:13:35 +08:00
```if (process.env.NODE_ENV !== 'test') {
mongoose.connect(config.mongoUrl, {
useNewUrlParser: true,
useFindAndModify: false,
});
}
```
没有用完就关
love
2019-08-12 22:17:18 +08:00
没用过 mongo,不过你 replaceOne 之后马上 close,node 可以有这种操作? replaceOne 应该是异步的吧
ilaipi
2019-08-12 22:19:53 +08:00
一直在用 mongoose,从来没有这个问题
rizon
2019-08-12 22:49:59 +08:00
@love #3 你说的好像很对唉,居然没出错。还一直用的好好地,为啥。。。
love
2019-08-12 23:32:30 +08:00
@rizon 也许关闭操作发现还有未完成命令就不关闭了。你还是要按照官方推荐写法来。
brickyang
2019-08-12 23:34:25 +08:00
正确姿势是连着不关。官方 DEMO 只是展示了一次操作完整的过程,并不是说每次都要连接和关闭。
jinliming2
2019-08-13 00:36:28 +08:00
@rizon #5 应该是 replaceOne 命令已经发送给 MongoServer 了,你 close 只是断开了 node 与 MongoServer 之间的连接,MongoServer 没有关啊,所以 replaceOne 命令还是会正常执行完的。
但是应该是获取不到 callback 了吧?或者能有 callback,但属于竞争条件了,看 callback 和 close 哪个先跑。
rizon
2019-08-13 10:36:14 +08:00
@brickyang #7 肯定要用连接池的吧,只是不知道连接池不知道怎么用,mongoServer 好像自带连接池,但是测了一下没生效
niknik
2019-08-13 11:17:39 +08:00
我用的 mongoose,感觉没啥问题啊
brickyang
2019-08-13 11:57:43 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/591315

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX