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

Expo SQLite代码重载后数据库锁定,单例连接模式失效的问题求助

Expo SQLite代码重载后数据库锁定,单例连接模式失效的问题求助

各位好,我最近在给Expo项目做代码重构,打算用Repository模式规整数据库操作,数据库连接这块用了单例模式实现的SQLiteConnectorV2,代码如下:

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的Fast Refresh或者全量重载(模拟器、真机上都会触发),之后再访问数据库就直接炸错:

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

我自己琢磨了下,怀疑是重载时旧的数据库连接没被正确释放,新的单例实例又去创建连接,导致两个连接冲突锁库了。我试过用globalThis来持久化连接对象,但重载的时候globalThis会被重置,根本存不住。

虽然这个问题应该只在开发环境出现,但开发时总不能每次改完代码都重启项目,或者硬着头皮忽略错误吧?毕竟保持连接复用+单例都是行业常规操作啊。

另外我还试了用OP SQLite,完全不会出现这个锁库问题,所以要么是我的排查方向错了,要么就是Expo SQLite锁的不是.db文件本身,而是它自己内部的某个资源?

想问问各位大佬,我是不是在单例实现或者连接管理上哪里写错了?还是说Expo SQLite在开发重载场景下有什么特殊的机制需要注意?

火山引擎 最新活动