我有一个像这样的Ignite Cache: IgniteCache 缓存;
缓存配置为:
<property name="readThrough" value="true" />
<property name="writeThrough" value="true" />
<property name="writeBehindEnabled" value="true" />
以及用于 MariaDB 3rd 方持久性的 CacheStore。
<property name="cacheStoreFactory">
<bean class="javax.cache.configuration.FactoryBuilder"
factory-method="factoryOf">
<constructor-arg>
<bean class="my_backend_bean">
<constructor-arg value="jdbc:mariadb://xxxxx" />
<constructor-arg value="user" />
<constructor-arg value="password" />
</bean>
</constructor-arg>
</bean>
</property>
总体来说这似乎运作良好。我看到使用 cache.put(key,object) 存储对象会快速返回,而 MariaDB 会异步更新。
但是,我遇到了一些问题,MariaDB 并不总是使用对象的最新值进行更新。我正在努力寻找原因。
所以这是我的问题: - 如果我执行一次cache.put("1", object),然后更改对象中的属性,然后再次执行cache.put("1", object),Ignite将调用缓存存储后端bean的write方法再次更新 MariaDB?我看到我的测试中发生了这种情况,但想知道 Ignite 什么时候可能不更新缓存存储?什么表明 Ignite 已针对同一密钥修改了对象?是否存在 Ignite 尚未将第一个对象写入存储而调用第二个 cache.put 的情况,这是否会导致不更新缓存存储的问题? - 我应该更好地检查cache.containsKey,然后调用cache.replace而不是cache.put吗?或者将替换实际调用我的缓存存储后端 bean 的删除函数?
谢谢!
使用 write Behind 时,可以在缓冲区满时刷新数据,也可以根据超时刷新数据。如果您没有看到更新,很可能尚未达到任何条件。请阅读此处了解更多详细信息:https://apacheignite.readme.io/docs/3rd-party-store#write-behind-caching
@DonTequila 检查您的配置后,您是否向数据源添加了任何连接池
<bean id="dataSourceEx" class="com.zaxxer.hikari.HikariDataSource">
<property name="driverClassName" value="oracle.jdbc.OracleDriver" />
<property name="jdbcUrl" value="jdbc:mariadb://xxxxx" />
<property name="username" value="user" />
<property name="password" value="pwd" />
<property name="maximumPoolSize" value="20" />
<property name="minimumIdle" value="10" />
<property name="idleTimeout" value="30000" />
</bean>