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在开发重载场景下有什么特殊的机制需要注意?




