4

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

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

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

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

4

1 回答 1

4

使用 write-behind 存储更新的顺序是未定义的,因为每个节点都是独立和异步写入的。如果你有外键约束,你应该使用直写。

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

于 2016-05-30T14:12:09.217 回答