ObjectBox Dart/Flutter 多隔离访问

ObjectBox Dart/Flutter multi-isolate access

正在为 a question stated in a comment 创建一个单独的线程...

How does ObjectBox handle concurrent(by different threads/isolates) write requests? example of my use case: FCM "onBackgroundmessage" call runs in a different isolate, the same time multiple write requests might happen. "Hive" is failing in this case completely. Is there any inbuild solution in ObjectBox?

dart 的 ObjectBox 基于使用 Transactions 处理并发的本机 ObjectBox 核心库。让我挑出与问题相关的几点:

  • 事务管理多线程;例如事务与线程相关联,反之亦然。
  • 只读事务永远不会被阻止或阻止写入事务。
  • 任何时候都只能有一个写事务;他们 运行 严格来说一个接一个(顺序)。

至于 Dart/Flutter 中的 isolate - 是的,他们可以安全地访问同一家商店,你只需要确保它真的 is 相同的本机商店实例。为此,您执行以下步骤:

  1. 像往常一样在主隔离中创建一个 Store() 实例。
  2. 获取 ByteData store.reference,其中包含有关原生商店的信息。
  3. 通过 SendPort.
  4. 将此引用发送到另一个隔离区
  5. 在另一个隔离区中,接收引用并使用 Store.fromReference(getObjectBoxModel(), msg as ByteData) 打开一个本地 Store 实例。
  6. 现在两个 isolate 都有自己的 Dart Store 实例,它们在内部使用相同的底层本地存储。因此,他们的事务是同步的,他们都看到相同的数据并获得数据更改的通知。

你可以看到我刚刚描述这个测试用例的代码:https://github.com/objectbox/objectbox-dart/blob/461a948439dcc42f3956b7d21b232eb9c2bc26e1/objectbox/test/isolates_test.dart#L50

确保在另一个隔离仍在使用时不要关闭商店。最好根本不要关闭它 - 这是在没有大量后台工作的普通应用程序中的最佳做法。