Ignite 客户端节点不会通过服务器节点将数据放入数据库(只在服务器上使用 writeThrough,没有 writeBehind)
Ignite client node does not put data though server nodes to DB (with writeThrough only on server, without writeBehind)
能否请您帮我解决以下问题:
我有以下分区缓存集群配置:
启用了 writeThrough 的服务器节点。他们能够通过 cacheStoreFactory=HibernateCacheStoreFactory
将数据写入数据库
没有 writeThrough 配置但有 clientMode=true
的客户端节点
我在客户端节点上执行 put,然后我看到,该数据被发送到服务器节点,但服务器节点仅执行 put 到缓存,但不调用 cacheStoreFactory(writeThrough 行为)。所以,数据只是缓存在集群中,并没有写入DB。
如果我向客户端节点添加 writeThrough 配置,当然会调用 writeThrough,但我想从客户端节点中删除对 Hibernate 的任何依赖。
此外,如果我在服务器端启用 writeBehind 配置,则会调用 writeThrough 功能,并且服务器节点将数据从客户端节点异步写入数据库。但是它不满足我的要求,因为我想在一个事务中从客户端节点执行puts。
是否可以在没有writeBehind的情况下从客户端节点执行put以通过writeThrough在事务中存储数据?
事务缓存从发起事务的节点(在您的情况下是客户端节点)写入持久性存储。这样做是因为事务可能包含存储在不同节点上的条目,如果存储也将从不同节点更新,则不可能保持缓存和数据库之间的事务一致性。
如果您无权访问客户端上的数据库,您可以向其中一台服务器发送一个闭包并在那里启动一个事务,如下所示:
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();
}
}
});
能否请您帮我解决以下问题:
我有以下分区缓存集群配置:
启用了 writeThrough 的服务器节点。他们能够通过
cacheStoreFactory=HibernateCacheStoreFactory
将数据写入数据库
没有 writeThrough 配置但有
clientMode=true
的客户端节点
我在客户端节点上执行 put,然后我看到,该数据被发送到服务器节点,但服务器节点仅执行 put 到缓存,但不调用 cacheStoreFactory(writeThrough 行为)。所以,数据只是缓存在集群中,并没有写入DB。
如果我向客户端节点添加 writeThrough 配置,当然会调用 writeThrough,但我想从客户端节点中删除对 Hibernate 的任何依赖。
此外,如果我在服务器端启用 writeBehind 配置,则会调用 writeThrough 功能,并且服务器节点将数据从客户端节点异步写入数据库。但是它不满足我的要求,因为我想在一个事务中从客户端节点执行puts。
是否可以在没有writeBehind的情况下从客户端节点执行put以通过writeThrough在事务中存储数据?
事务缓存从发起事务的节点(在您的情况下是客户端节点)写入持久性存储。这样做是因为事务可能包含存储在不同节点上的条目,如果存储也将从不同节点更新,则不可能保持缓存和数据库之间的事务一致性。
如果您无权访问客户端上的数据库,您可以向其中一台服务器发送一个闭包并在那里启动一个事务,如下所示:
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();
}
}
});