Ignite 缓存存储中的对象何时更新并启用后写?

问题描述 投票:0回答:2

我有一个像这样的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 的删除函数?

谢谢!

java ignite
2个回答
2
投票

使用 write Behind 时,可以在缓冲区满时刷新数据,也可以根据超时刷新数据。如果您没有看到更新,很可能尚未达到任何条件。请阅读此处了解更多详细信息:https://apacheignite.readme.io/docs/3rd-party-store#write-behind-caching


0
投票

@DonTequila 检查您的配置后,您是否向数据源添加了任何连接池

  • 您的数据源是否从连接池获取连接?我从你的配置中看不到
  • 附加到Ignite配置[数据源池] 链接到外部数据源
  • 示例没有任何数据源,您可以像下面这样配置[前提是您使用的是 spring bean 配置]
  • 监视 MariaDB 中的数据库会话,如果有 2 个活动连接,则创建了多少连接,那么这可能会导致 Ignite 写入缓存存储的延迟
  <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>
© www.soinside.com 2019 - 2024. All rights reserved.