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 什么意思?
1
leven87 2019-08-12 22:11:05 +08:00
我是用 mongoose 连接的,暂时还没处理大量连接的问题
|
2
leven87 2019-08-12 22:13:35 +08:00
```if (process.env.NODE_ENV !== 'test') {
mongoose.connect(config.mongoUrl, { useNewUrlParser: true, useFindAndModify: false, }); } ``` 没有用完就关 |
3
love 2019-08-12 22:17:18 +08:00
没用过 mongo,不过你 replaceOne 之后马上 close,node 可以有这种操作? replaceOne 应该是异步的吧
|
4
ilaipi 2019-08-12 22:19:53 +08:00 via iPhone
一直在用 mongoose,从来没有这个问题
|
7
brickyang 2019-08-12 23:34:25 +08:00 via iPhone
正确姿势是连着不关。官方 DEMO 只是展示了一次操作完整的过程,并不是说每次都要连接和关闭。
|
8
jinliming2 2019-08-13 00:36:28 +08:00
@rizon #5 应该是 replaceOne 命令已经发送给 MongoServer 了,你 close 只是断开了 node 与 MongoServer 之间的连接,MongoServer 没有关啊,所以 replaceOne 命令还是会正常执行完的。
但是应该是获取不到 callback 了吧?或者能有 callback,但属于竞争条件了,看 callback 和 close 哪个先跑。 |
9
rizon OP @brickyang #7 肯定要用连接池的吧,只是不知道连接池不知道怎么用,mongoServer 好像自带连接池,但是测了一下没生效
|
10
niknik 2019-08-13 11:17:39 +08:00
我用的 mongoose,感觉没啥问题啊
|
11
brickyang 2019-08-13 11:57:43 +08:00
@rizon
connect() 使用 poolSize 参数: http://mongodb.github.io/node-mongodb-native/3.3/api/MongoClient.html#.connect 推荐官方驱动: https://github.com/mongodb/node-mongodb-native 我有一个简化操作的包: https://github.com/brickyang/easy-mongodb |