关于连接池的问题
02:33左右老师说会爆内存,因为每次请求都会走dataSourceFactory,都会new 一个 DataSource,会创建数据库连接池
源码里真没对这块进行处理吗。。。不可能吧。。。不说多了,就并发几十个请求, 真这样一个再怎么普通的应用内存也早蹦了,
应该在new DataSource(options).initialize()里自己就做了dataSource的复用
正在回答 回答被采纳积分+1
你可以继续看,把视频看完~~
应该在new DataSource(options).initialize()里自己就做了dataSource的复用——明确的说,没有。
官方只是对单库或者多库的场景下,使用AppShutDown生命周期方法进行清理:
async onApplicationShutdown(): Promise<void> {
const dataSource = this.moduleRef.get<DataSource>(
getDataSourceToken(this.options as DataSourceOptions) as Type<DataSource>,
);
try {
if (dataSource && dataSource.isInitialized) {
await dataSource.destroy();
}
} catch (e) {
this.logger.error(e?.message);
}
}下面是分析过程,1. typeorm的initialize,直接throw了,又没有返回实例,按照数据操作逻辑,应该是操作完成之后,自己断开,所以不需要维护。

但是,现在人写代码比较“懒”,一般不会自己主动destroy或者connect,所以才需要加一个连接池来维护:
下面是nestjs/typeorm的 initialize:

官方待办:移除“dataSource.initialize”条件(保留以支持向后兼容性)
let dataSource: DataSource;
if (!options.autoLoadEntities) {
dataSource = await createTypeormDataSource(
options as DataSourceOptions,
);
} else {
let entities = options.entities;
if (Array.isArray(entities)) {
entities = entities.concat(
EntitiesMetadataStorage.getEntitiesByDataSource(dataSourceToken),
);
} else {
entities =
EntitiesMetadataStorage.getEntitiesByDataSource(dataSourceToken);
}
dataSource = await createTypeormDataSource({
...options,
entities,
} as DataSourceOptions);
}你再像上看看 dataSource 这个变量是一个本地变量,只缓存了entites实体类,并没有缓存datasource。
每次都是在调用:
dataSource = await createTypeormDataSource({
...options,
entities,
} as DataSourceOptions);每次调用 createDataSourceFactory 都会根据提供的 options 和 dataSourceFactory 生成一个新的或定制的 DataSource 实例
从哪里可以看出来 ?你可以连接一下数据库,看看连接池的变化就知道了~~~
参考Prisma部分的示例:https://class.imooc.com/lesson/3119#mid=78698
- 参与学习 324 人
- 解答问题 408 个
全新打造“技术成长&职业破局”双高体系,深度打通“全栈 + 全流程 +多端+ 提效+AI赋能”,递进式锤炼思维与高阶技能,高效实现能力跃迁,助力成为“驾驭全局,深广兼备,打通多端全栈”的高级工程师
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星