2016-04-22 94 views
3

我在尝试对连接到具有外键约束的表的高速缓存使用后写时遇到问题。看起来,后写机制不是以确定性的顺序执行更新/插入,而是试图按照某个未知顺序连续地为每个高速缓存推送所有收集的更改。但是由于表中有外键,操作的顺序很重要,所以应该首先插入/更新父对象,然后才会更新父对象(否则会从DB中抛出外键违例)。如何在Apache Ignite中使用外部后写入

看来,目前的实现正在尝试一个试错性(org.apache.ignite.cache.store.jdbc.CacheAbstractJdbcStore:888),这意味着它会定期重试一次又一次刷新的更改进行缓存的情况下,在解决这一问题其中的约束违规发生。因此,“子”缓存将定期重试刷新,直到“父”缓存首先被刷新。这最终会导致数据进入数据库,但这也意味着在复杂分层表的情况下会尝试很多不成功的尝试,直到找到正确的顺序为止。这会导致数据库性能下降和不必要的炮击。

对于我如何绕过这个问题你有什么建议吗?

(最初我用写渡过艰难,但却造成了性能非常差,因为CacheAbstractJdbcStore貌似是打开一个新的准备好的声明中每个插入/更新操作。)

回答

2

随着后写的顺序的商店更新是未定义的,因为每个节点独立和异步地写入。如果你有外键约束,你应该使用直写。

对于直写性能,CacheAbstractJdbcStore采用可配置的DataSource进行操作,因此它依赖于其实现是否每次都打开一个新连接。如果你使用一些合并版本,这不会发生。