Scala 点燃具有不同亲和键的缓存之间的搭配

Scala 点燃具有不同亲和键的缓存之间的搭配,scala,ignite,Scala,Ignite,假设我在独立的Ignite缓存中有两个表,A和B,分别有相应的键: case class AKey( @(QuerySqlField@field) id: Long, @(AffinityKeyMapped@field) @(QuerySqlField@field) parentId: Long ) case class BKey( @(AffinityKeyMapped@field) @(QuerySqlField@field) aId: Long )

假设我在独立的Ignite缓存中有两个表,
A
B
,分别有相应的键:

case class AKey(
    @(QuerySqlField@field) id: Long,
    @(AffinityKeyMapped@field)
    @(QuerySqlField@field) parentId: Long
)

case class BKey(
    @(AffinityKeyMapped@field)
    @(QuerySqlField@field) aId: Long
)
其中,
A.parentId
是表
A
中另一项的自引用,
B.aId
是对
A.id
的引用

如果我希望所有
A
条目都具有相同的
parentId
,但我也希望所有
B
条目都与引用的
A
条目的
parentId
并置,那么在
B
中不包含
parentId
字段的情况下,我如何设置此关联关系?或者这是不可能的

从Ignite的文档中,我不清楚Ignite如何在表之间建立关联关系。

Ignite如何管理关联配置 Ignite并没有真正建立任何“亲和力关系”。它所做的只是将缓存键映射到关联键。所有缓存中具有相同相似性密钥的所有条目都保证并置

例如,使用以下键获取缓存

class KeyA { int a1; int a2; @AffinityKeyMapped int affKey; }
class KeyB { int b1; int b2; @AffinityKeyMapped int affKey; }
这里我们说,
KeyA
KeyB
通过
affKey
并置-当
affKey
的值匹配时,条目将并置。但事实上,Ignite不知道
KeyA
KeyB
之间的联系,它分别处理这些表。只有保证关联密钥到节点的映射是一致的,才能实现这一点。换言之,这些隐藏物之间的关系只存在于我们的头脑中,我们有责任确保它们的搭配是正确的

解决方案 最后,关于你的情况。这可能会令人惊讶,但parentId并不是亲和力密钥的理想候选项。假设我们有三个值

{ id: 1, parentId: 0 }
{ id: 2, parentId: 1 }
{ id: 3, parentId: 2 }
在这里,人们可以期望所有值都被并置,因为它们都在同一“链”中相互引用。但这是一段Ignite不知道的关系。它只知道有三个不同的
parentId
值-因此,有三个不同的亲和键,没有搭配

要正确处理此问题,必须提供一些保证所有值相同的
groupdId
。在您的情况下,一个自然的匹配是“树”中根元素的ID。然后,
groupdId
将成为
@AffinityKeyMapped

{ id: 1, parentId: 0, groupId: 1 }
{ id: 2, parentId: 1, groupId: 1 }
{ id: 3, parentId: 2, groupId: 1 }
不幸的是,第二个缓存必须引用与affinity key完全相同的值,如果不将其作为字段添加,则无法执行此操作

{ aId: 2, aGroupId: 1 }
此外,尽管它与问题没有直接关系,但请确保
@AffinityKeyMapped
是缓存键的一部分,而不是值的一部分-否则,它将被忽略。

Ignite如何管理亲和性搭配 Ignite并没有真正建立任何“亲和力关系”。它所做的只是将缓存键映射到关联键。所有缓存中具有相同相似性密钥的所有条目都保证并置

例如,使用以下键获取缓存

class KeyA { int a1; int a2; @AffinityKeyMapped int affKey; }
class KeyB { int b1; int b2; @AffinityKeyMapped int affKey; }
这里我们说,
KeyA
KeyB
通过
affKey
并置-当
affKey
的值匹配时,条目将并置。但事实上,Ignite不知道
KeyA
KeyB
之间的联系,它分别处理这些表。只有保证关联密钥到节点的映射是一致的,才能实现这一点。换言之,这些隐藏物之间的关系只存在于我们的头脑中,我们有责任确保它们的搭配是正确的

解决方案 最后,关于你的情况。这可能会令人惊讶,但parentId并不是亲和力密钥的理想候选项。假设我们有三个值

{ id: 1, parentId: 0 }
{ id: 2, parentId: 1 }
{ id: 3, parentId: 2 }
在这里,人们可以期望所有值都被并置,因为它们都在同一“链”中相互引用。但这是一段Ignite不知道的关系。它只知道有三个不同的
parentId
值-因此,有三个不同的亲和键,没有搭配

要正确处理此问题,必须提供一些保证所有值相同的
groupdId
。在您的情况下,一个自然的匹配是“树”中根元素的ID。然后,
groupdId
将成为
@AffinityKeyMapped

{ id: 1, parentId: 0, groupId: 1 }
{ id: 2, parentId: 1, groupId: 1 }
{ id: 3, parentId: 2, groupId: 1 }
不幸的是,第二个缓存必须引用与affinity key完全相同的值,如果不将其作为字段添加,则无法执行此操作

{ aId: 2, aGroupId: 1 }

此外,尽管它与问题没有直接关系,但请确保
@AffinityKeyMapped
是缓存键的一部分,而不是值的一部分-否则,它将被忽略。

命名约定是否重要,或者仅仅是“任何缓存中具有值x的任何关联键都保证位于同一节点上”?命名不重要,只有值。亲和键的值映射到分区号,分区映射到节点。映射代码(实际上,这是在
CacheConfiguration.affinity
中设置的函数)不知道名称、缓存等,并且通常对所有类和键都是相同的。那么命名约定是否有任何意义,或者只是“任何缓存中具有值x的任何affinity键都保证位于同一节点上”?命名并不重要,只有值。亲和键的值映射到分区号,分区映射到节点。映射代码(实际上,这是在
CacheConfiguration.affinity
中设置的函数)不知道名称、缓存等,通常对所有类和键都是相同的。