0

为评论中陈述的问题创建一个单独的线程......

ObjectBox 如何处理并发(通过不同的线程/隔离)写请求?我的用例示例:FCM“onBackgroundmessage”调用在不同的隔离中运行,同时可能发生多个写入请求。在这种情况下,“Hive”完全失败了。ObjectBox 中是否有任何内置解决方案?

4

1 回答 1

0

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

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

至于Dart/Flutter中的隔离- 是的,它们可以安全地访问同一个 store,你只需要确保它确实同一个本地 store 实例。为此,请执行以下步骤:

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

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

确保在另一个隔离物仍在使用时不要关闭商店。最好不要关闭它——这是在没有大量后台工作的正常应用程序中的最佳实践。

于 2021-07-25T14:05:25.233 回答