You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Expo SQLite 应用重载后出现数据库锁定错误的问题排查求助

Expo SQLite 应用重载后出现数据库锁定错误的问题排查求助

大家好,我最近在重构代码、实现仓库模式,数据库访问用的是下面这个单例类:

class SQLiteConnectorV2 {
  private static instance: SQLiteConnectorV2 | null = null;
  public db: ExpoSQLiteDatabase;
  private nativeDb: ReturnType<typeof SQLite.openDatabaseSync> | null = null;

  private constructor() {
    const sqliteDb = SQLite.openDatabaseSync(DB_NAME);
    this.nativeDb = sqliteDb;
    this.db = drizzle(sqliteDb);
  }

  public static getInstance(): SQLiteConnectorV2 {
    if (!SQLiteConnectorV2.instance) {
      SQLiteConnectorV2.instance = new SQLiteConnectorV2();
    }
    return SQLiteConnectorV2.instance;
  }
}

这个单例在正常运行时完全没问题,但只要我改代码触发了Expo的快速刷新/全量重载(不管是在模拟器还是真机上),之后访问数据库就会直接抛错:

Error: [Error: Call to function 'NativeStatement.runSync' has been rejected. → Caused by: Error code : database is locked]

我自己排查了下,怀疑是之前的数据库连接没有被正确关闭,新启动的应用实例尝试建立连接时和旧连接冲突了。我试过用globalThis来持久化连接,但重载会直接重置globalThis对象,根本起不到作用。

虽然这个问题应该只在开发环境出现,但开发时总不能每次改完代码都重启应用,或者硬着头皮忽略错误吧?毕竟保持连接打开+单例都是数据库操作的常规做法啊,难道我哪里写得不对?

另外我还试了用OP SQLite,就不会出现这个锁定错误,所以要么是我的分析错了,要么被锁定的不是.db文件本身,而是Expo SQLite内部的某个资源?

有没有大佬遇到过类似的问题,或者能帮我看看问题出在哪了?

火山引擎 最新活动