Sqflite数据存储模型&无必要使用Isolate操作数据库

Sqflite存储模型如下:

依据上图Sqflite插件的DB存储模型会有2个等待队列,一个是Flutter层同步执行队列,一个是Native层的线程执行队列

  • Android实现机制是HandlerThread,底层使用同一个静态变量,因此Query/Save读写在会同一线程队列中,不同数据库的操作也需要在同一个线程队列中排队。具体参考代码 SqflitePlugin.java

  • 其iOS的实现是通过 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),...),把任务调度到系统的后台线程排队顺序执行,原理类似于HandlerThread。只是这样会造成一个问题,如果其他功能也使用系统队列,会造成不必要的延迟。iOS定义一个数据库专用线程会更好一些。具体参考代码 SqflitePlugin.m

我们在系统层调用 Sqlite 的时候,需要注意 Sqlite 调用的耗时阻塞问题,一般都是在子线程中操作数据库,而由于 Sqflite 系统层后台线程队列的存在,在 Flutter 层,其实没必要使用 isolate 对耗时操作进行规避,这点与原生开发不同。

注意

如果确实需要在 isolate 中执行 Sqflite 相关的调用,一般建议使用 FlutterIsolate 创建 isolate ,主要原因还是 Sqlite 相关的调用都是 Platform Channel 的调用。默认情况下,在 isolate 是不允许调用这些函数的。

FlutterIsolate allows creation of an Isolate in flutter that is able to use flutter plugins. It creates the necessary platform specific bits (FlutterBackgroundView on android & FlutterEngine on iOS) to enable the platform channels to work inside an isolate.

参考链接


发布者

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注