如何在 Apache Ignite 中使用 Write-behind 和外键

Posted

技术标签:

【中文标题】如何在 Apache Ignite 中使用 Write-behind 和外键【英文标题】:How to use Write-behind with foreign keys in Apache Ignite 【发布时间】:2016-08-15 16:24:00 【问题描述】:

我在尝试对连接到在它们之间具有外键约束的表的缓存上使用 write-behind 时遇到问题。看起来后写机制不是以确定的顺序执行更新/插入,而是试图以某种未知的顺序连续推送每个缓存收集的所有更改。但是由于我们在表中有外键,所以操作的顺序很重要,所以应该首先插入/更新父对象,然后才插入/更新子对象(否则从数据库中抛出外键违规)。

目前的实现似乎正在尝试在试错的基础上解决这个问题 (org.apache.ignite.cache.store.jdbc.CacheAbstractJdbcStore:888),这意味着它会定期重试一次又一次地刷新缓存的更改,以防万一发生约束冲突。因此“子”缓存将定期重试刷新,直到“父”缓存首先被刷新。这最终将导致数据进入数据库,但这也意味着在复杂的分层表的情况下会进行很多不成功的尝试,直到“找到”正确的顺序。这会导致性能不佳和数据库不必要的脱壳。

您对如何规避此问题有任何建议吗?

(最初我尝试使用直写,但它导致性能非常差,因为CacheAbstractJdbcStore 似乎为每个插入/更新操作打开了一个新的准备好的语句。)

【问题讨论】:

【参考方案1】:

使用后写存储更新的顺序是不确定的,因为每个节点都是独立且异步地写入的。如果你有外键约束,你应该使用直写。

至于直写性能,CacheAbstractJdbcStore 使用可配置的DataSource 运行,因此每次是否打开新连接都取决于其实现。如果您使用一些池化版本,则不会发生这种情况。

【讨论】:

以上是关于如何在 Apache Ignite 中使用 Write-behind 和外键的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Apache Ignite 中使用 Write-behind 和外键

如何使Apache Ignite缓存中的对象无效

Apache Spark + Ignite 集群瘦客户端

如何使用 Apache Ignite.NET 瘦客户端连接到特定网格

Apache Ignite 学习

获取apache ignite缓存中的数据行数少于实际行数