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内部的某个资源?
有没有大佬遇到过类似的问题,或者能帮我看看问题出在哪了?




