NestJS应用重启前无法获取数据库最新数据问题求助
问题根因与解决方案
你遇到的是TypeORM隐式缓存+数据库视图未实时刷新的组合问题,可按以下步骤逐一排查修复:
1. 关闭TypeORM全局查询缓存
你当前创建连接的配置中没有显式禁用缓存,TypeORM默认会开启隐式结果缓存,导致查询直接返回内存缓存值而非实时查库。修改连接创建配置,添加cache: false参数:
const createdConnection: Connection = await createConnection({ name: connectionId, type: 'mysql', host: this.configService.get<string>('database.host'), port: this.configService.get<number>('database.port'), username: tenant.dbLogin, password: tenant.dbPassword, database: tenant.dbName, insecureAuth: true, // 新增禁用缓存配置 cache: false, entities: [ Tenant, User, UserView, Company, CompanyView, Invoice, InvoiceView, Item, ItemView, Invoicearchiv, InvoicearchivView, Itemarchiv, ItemarchivView, Dictionary, ], logging: this.configService.get<boolean>('database.logging') });
2. 强制单查询不走缓存
如果需要保留全局缓存仅让当前接口实时查库,可在查询构建器链中添加useCache(false)配置:
private async getQueryBuilderWithJoins(connection: Connection) { const queryBuilder = await connection.getRepository(InvoiceView).createQueryBuilder('inv'); // 新增禁用当前查询缓存配置 queryBuilder.useCache(false); queryBuilder.leftJoinAndMapMany('inv.items', ItemView, 'i', 'inv.id = i.idInvoice'); return queryBuilder; }
3. 检查数据库视图更新逻辑
你查询的是InvoiceView和ItemView两个数据库视图,若视图是物化视图或者定时刷新的非实时视图,基础表数据变更后视图不会自动同步。可以先直接查询Invoice基础表验证是否还有旧数据:
// 测试查询基础表,确认是否是视图更新延迟问题 const testData = await connection.getRepository(Invoice).find(); console.log(testData);
如果基础表查询结果正常,就需要修改视图为实时更新,或者在基础表数据增删改后手动触发视图刷新。
4. 排查事务隔离级别
如果你的增删改操作没有显式提交事务,或者数据库全局隔离级别设置为可重复读(REPEATABLE READ),也可能导致查询看不到最新提交的数据。可以在查询时设置读已提交隔离级别:
await connection.getRepository(InvoiceView).createQueryBuilder('inv') .setIsolationLevel("READ COMMITTED")
内容的提问来源于stack exchange,提问作者kaskousGaming
相关产品推荐
相关产品推荐

