scala - 点燃具有不同亲和键的缓存之间的搭配
问题描述
假设我在单独的 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
条目与parentId
引用条目的 并置,我将如何在不包含字段的A
情况下设置这种亲和关系?或者这是不可能的?parentId
B
从 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 并不是亲和键的理想选择。假设我们在 A 中有三个值
{ 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 }
不幸的是,第二个缓存必须引用完全相同的关联键值,如果不将其添加为字段,就无法做到这一点。
{ aId: 2, aGroupId: 1 }
此外,虽然它与问题没有直接关系,但请确保它@AffinityKeyMapped
是缓存键的一部分,而不是值的一部分 - 否则,它将被忽略。
推荐阅读
- .net - 切换按钮中的 wpf 图像不显示
- java - 我们可以对 MySQL 和 Java 中的加密列执行通配符搜索吗
- amazon-web-services - 在查询结构列时面临访问被拒绝
- mql4 - 以不同于 EA 在 MQL4 中运行的交易品种进行交易
- docker - File created in interactive session within container dissapears after exiting container (container running in background)
- ruby-on-rails - has_many 中的表名通过关系
- javascript - 超越 JavaScript Snake Game - 游戏所需的不同 berry 代码帮助
- c++ - Visual Studio 中的警告 C4267:“参数”:从“size_t”转换为“const _Elem”,可能丢失数据
- java - 如何将蓝牙接收代码添加到我的代码中?
- java - 如何制作二进制翻译器?