1

你能帮我解决以下问题吗:

我有以下分区缓存集群配置:

  • 启用 writeThrough 的服务器节点。他们能够通过以下方式将数据写入数据库cacheStoreFactory=HibernateCacheStoreFactory

  • 没有 writeThrough 配置但有clientMode=true

我在客户端节点上执行 put,然后我看到,该数据被发送到服务器节点,但服务器节点仅对缓存执行 put,但不调用 cacheStoreFactory(writeThrough 行为)。因此,数据只缓存在集群中,而不是写入数据库。

如果我将 writeThrough 配置添加到客户端节点,当然会调用 writeThrough,但我想从客户端节点中删除对 Hibernate 的任何依赖项。

此外,如果我在服务器端启用 writeBehind 配置,则会调用 writeThrough 功能并且服务器节点将数据从客户端节点异步写入数据库。但它不能满足我的要求,因为我想在一个事务中从客户端节点执行 put。

是否可以在没有 writeBehind 的情况下在事务中使用 writeThrough 从客户端节点执行 put 以存储数据?

4

1 回答 1

3

事务缓存从发起事务的节点(在您的情况下是客户端节点)写入持久性存储。这样做是因为一个事务可能包含存储在不同节点上的条目,并且如果存储也将从不同的节点更新,则不可能保持缓存和数据库之间的事务一致性。

如果您无权访问客户端上的数据库,则可以向其中一个服务器发送闭包并在那里启动事务,如下所示:

Ignition.ignite().compute().run(new IgniteRunnable() {
    @IgniteInstanceResource
    private Ignite ignite;

    @Override public void run() {
        try (Transaction tx = ignite.transactions().txStart()) {
            // Cache operations go here...

            tx.commit();
        }
    }
});
于 2016-04-01T17:31:10.490 回答