mongodb - NestJS - 打开了太多的 MongoDB 连接
问题描述
我将 NestJS 用于我们的微服务,这是我们连接到 MongoDB 的方式。
import { Inject, Injectable, Scope } from '@nestjs/common';
import {
MongooseOptionsFactory,
MongooseModuleOptions,
} from '@nestjs/mongoose';
import { REQUEST } from '@nestjs/core';
import { Request } from '@nestjs/common';
import * as fs from 'fs';
@Injectable()
export class MongoDBService implements MongooseOptionsFactory {
constructor(@Inject(REQUEST) private readonly request: Request) {}
createMongooseOptions(): MongooseModuleOptions {
if (process.env.ENVIRONMENT === 'local.dev') {
return {
uri: process.env.MONGO_URL,
};
}
return {
uri: process.env.MONGO_URL,
ssl: Boolean(process.env.MONGO_SSL),
poolSize: 10,
maxPoolSize: 25,
sslCA: [
fs.readFileSync(
__dirname + '/../../config/certificates/EnterpriseRootCA.cer',
),
],
};
}
}
这包含在应用程序模块中,如下所示
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
envFilePath: `config/${process.env.ENVIRONMENT}.env`,
}),
TerminusModule,
// EventEmitterModule.forRoot({ wildcard: true, delimiter: '.' }),
MongooseModule.forRootAsync({ useClass: MongoDBService }),
ScorecardModule,
// DriverlicenseModule,
PersistenceModule,
MigrateModule,
PurgeModule,
],
providers: [MongoDBService, RedisPersistService, MongoDBHealthIndicator],
controllers: [HealthController],
})
export class AppModule {}
在进行一些插入和选择操作后,MongoDB 会出现“打开的连接过多”错误。当我们使用 MongooseModule 时,我需要做些什么来连接或关闭连接吗?这是来自 MongoDB 的日志
{"remote":"X.X.X.X:41412","connectionId":15945,"connectionCount":2015}}
{"t":{"$date":"2021-05-18T20:37:16.615+00:00"},"s":"I", "c":"NETWORK", "id":22943, "ctx":"listener","msg":"Connection accepted","attr":{"remote":"X.X.X.X:41412:41414","connectionId":15946,"connectionCount":2016}}
{"t":{"$date":"2021-05-18T20:37:16.616+00:00"},"s":"I", "c":"NETWORK", "id":22943, "ctx":"listener","msg":"Connection accepted","attr":{"remote":"X.X.X.X:41412:41416","connectionId":15947,"connectionCount":2017}}
{"t":{"$date":"2021-05-18T20:37:16.621+00:00"},"s":"I", "c":"-", "id":22948, "ctx":"listener","msg":"pthread_create failed","attr":{"error":"Resource temporarily unavailable"}}
{"t":{"$date":"2021-05-18T20:37:16.621+00:00"},"s":"W", "c":"EXECUTOR", "id":22993, "ctx":"conn15947","msg":"Terminating session due to error","attr":{"error":{"code":1,"codeName":"InternalError","errmsg":"failed to create service entry worker thread"}}}
{"t":{"$date":"2021-05-18T20:37:16.621+00:00"},"s":"I", "c":"NETWORK", "id":22944, "ctx":"listener","msg":"Connection ended","attr":{"remote":"X.X.X.X:41412:41416","connectionId":15947,"connectionCount":2016}}
正如您在日志中看到的,connectionCount 远远超过 2000,即使我的连接池设置为 25。任何帮助/建议将不胜感激
解决方案
推荐阅读
- r - 如何修复在 R 中声明的 Object(...) not found
- python - Messed up my macOS system package with pip package
- angular - 如何检测间隔可观察开始请求的时间?
- go - Passing info from channel to channel while altering it in go
- matlab - Matlab:与 Windows C++ 可执行文件的接口
- python - 如何测试不正确的数据输入
- django - Django 只能将 str (不是“列表”)连接到 str
- python - 为什么python没有内置函数mean()?
- opencv - 在 OpenCV 中浏览视频非常消耗 CPU,为什么观看视频不那么密集?
- javascript - Javascript 需要两次点击来初始化我想要它做的事情