Geode事务以生成ID并插入对象

时间:2019-04-15 20:08:44

标签: gemfire geode

假设我有3个PARTITIONED_REDUNDANT地区:

  • / Orders-键是Longs(从/ Sequences分配的ID),值是Order的实例
  • / OrderLineItems-键是Longs(从/ Sequences分配的ID),值是OrderLineItem的实例
  • /序列-键是字符串(序列的名称),值是Longs

/ Sequences区域将有许多条目,每个条目都是存储在另一个区域(例如/ Orders,/ OrderLineItems,/ Products等)的某种持久类型的ID序列

我想运行一个Geode事务,该事务将一个Order和一组OrderLineItems持久保存在一起。

并且,我想从/ Sequences区域中的项分别为Order和OrderLineItems分配ID,这些项的键分别为“ Orders”和“ OrderLineItems”。这就像在关系数据库中的“自动增量”列中那样操作-在插入时作为事务的一部分分配/分配ID。

Orders和OrderLineItems 的插入以及/ Sequences区域中ID的分配必须在事务上保持一致-它们一起成功或失败。

我了解,如果对区域进行了分区,Geode要求在事务中操作的数据必须位于同一位置。

显而易见的是将OrderLineItems与拥有的Order放置在一起,这可以通过PartitionResolver来完成,该PartitionResolver返回Order的ID作为路由对象。

但是,交易中仍然涉及/ Sequences区域,我不清楚如何将数据与Order和OrderLineItems一起放置。

/ Sequences reqion的“ Orders”条目将需要与为其生成ID的每个Order都位于同一位置...不是吗?显然这是不可能的。

还是有另一种/更好的方法(例如,更改/ Sequences的区域类型)?

谢谢您的建议。

1 个答案:

答案 0 :(得分:0)

根据/ Sequences区域中的数据量,您可以使该区域成为复制区域。复制的区域被认为与所有其他区域位于同一位置,因为它在所有成员上都可用。

https://geode.apache.org/docs/guide/15/developing/transactions/data_location_cache_transactions.html

如果同时创建大量条目,此模式可能会很昂贵。每个创建都会经历这些共享的全局序列。您可能最终会遇到很多事务冲突,尤其是当您通过递增上次使用的序列号来获取下一个序列号时。

作为替代方案,您可能希望将UUID用作Orders和OrderLineItems等的键。UUID占用的空间是长度的两倍,但是您可以分配随机的UUID,而无需在并发创建之间进行任何协调。 / p>