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 相同的本机商店实例。为此,您执行以下步骤:
- 像往常一样在主隔离中创建一个
Store()
实例。
- 获取
ByteData store.reference
,其中包含有关原生商店的信息。
- 通过
SendPort
. 将此引用发送到另一个隔离区
- 在另一个隔离区中,接收引用并使用
Store.fromReference(getObjectBoxModel(), msg as ByteData)
打开一个本地 Store
实例。
- 现在两个 isolate 都有自己的 Dart
Store
实例,它们在内部使用相同的底层本地存储。因此,他们的事务是同步的,他们都看到相同的数据并获得数据更改的通知。
你可以看到我刚刚描述这个测试用例的代码:https://github.com/objectbox/objectbox-dart/blob/461a948439dcc42f3956b7d21b232eb9c2bc26e1/objectbox/test/isolates_test.dart#L50
确保在另一个隔离仍在使用时不要关闭商店。最好根本不要关闭它 - 这是在没有大量后台工作的普通应用程序中的最佳做法。
正在为 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 相同的本机商店实例。为此,您执行以下步骤:
- 像往常一样在主隔离中创建一个
Store()
实例。 - 获取
ByteData store.reference
,其中包含有关原生商店的信息。 - 通过
SendPort
. 将此引用发送到另一个隔离区
- 在另一个隔离区中,接收引用并使用
Store.fromReference(getObjectBoxModel(), msg as ByteData)
打开一个本地Store
实例。 - 现在两个 isolate 都有自己的 Dart
Store
实例,它们在内部使用相同的底层本地存储。因此,他们的事务是同步的,他们都看到相同的数据并获得数据更改的通知。
你可以看到我刚刚描述这个测试用例的代码:https://github.com/objectbox/objectbox-dart/blob/461a948439dcc42f3956b7d21b232eb9c2bc26e1/objectbox/test/isolates_test.dart#L50
确保在另一个隔离仍在使用时不要关闭商店。最好根本不要关闭它 - 这是在没有大量后台工作的普通应用程序中的最佳做法。