You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 01:45:04