Java 如何在ApacheIgnite中使用带外键的Write-behind

Java 如何在ApacheIgnite中使用带外键的Write-behind,java,jdbc,ignite,Java,Jdbc,Ignite,我在尝试对连接到表的缓存使用write-behind时遇到问题,这些表之间有外键约束。看起来,write-behind机制并不是以确定的顺序执行更新/插入,而是试图以未知的顺序连续推送每个缓存中收集的所有更改。但由于表中有外键,操作的顺序很重要,因此应该首先插入/更新父对象,然后才插入/更新子对象(否则会从数据库中抛出外键冲突) 当前的实现似乎是在尝试和错误的基础上解决这个问题(org.apache.ignite.cache.store.jdbc.CacheAbstractJdbcStore:8

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

当前的实现似乎是在尝试和错误的基础上解决这个问题(
org.apache.ignite.cache.store.jdbc.CacheAbstractJdbcStore:888
),这意味着如果发生约束冲突,它将定期重试刷新缓存的更改。因此,“子”缓存将定期重试刷新,直到“父”缓存首先刷新。这最终将导致将数据放入数据库,但这也意味着在复杂的分层表中会有很多不成功的尝试,直到“找到”正确的顺序。这会导致数据库性能差和不必要的去壳

你对我如何回避这个问题有什么建议吗


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

由于每个节点都独立且异步地写入,因此未定义存储更新顺序后的写入。如果有外键约束,则应使用直写

至于直写性能,
CacheAbstractJdbcStore
使用可配置的
DataSource
进行操作,因此每次是否打开新连接取决于它的实现。如果使用某个池版本,则不会发生这种情况