我在尝试在连接到表的缓存上使用write-behind时遇到问题,这些表之间有外键约束。看似后写机制不是以确定性顺序执行更新/插入,而是尝试以某种未知顺序连续地按每个高速缓存推送所有收集的更改。但是由于我们在表中有外键,操作的顺序很重要,因此应首先插入/更新父对象,然后仅在此之后插入子对象(否则将从DB中抛出外键冲突)。
目前的实现似乎是试图在试错的基础上解决这个问题(org.apache.ignite.cache.store.jdbc.CacheAbstractJdbcStore:888
),这意味着它会定期重试一次又一次地为缓存刷新更改其中发生了约束违规。所以"孩子"缓存会定期重试刷新,直到" parent"缓存首先刷新。这最终将导致数据进入数据库,但是在复杂的分层表的情况下,这也意味着许多不成功的尝试,直到找到正确的顺序""。这导致性能差和DB不必要的炮轰。
您对我如何规避这个问题有什么建议吗?
(最初我尝试使用直写,但是它导致了非常糟糕的性能,因为CacheAbstractJdbcStore
似乎为每个插入/更新操作打开了一个新的预准备语句。)
答案 0 :(得分:3)
使用write-behind时,存储更新的顺序是未定义的,因为每个节点都是独立和异步写入的。如果您有外键约束,则应使用直写。
对于直写性能,CacheAbstractJdbcStore
使用可配置的DataSource
进行操作,因此它是否依赖于其实现是否每次都打开新连接。如果您使用某些池化版本,则不会发生这种情况。