我的Ignite节点(2个服务器节点 - 我们称之为A和B)配置如下:
ccfg.setCacheMode(CacheMode.PARTITIONED);
ccfg.setAtomicityMode(CacheMode.TRANSACTIONAL);
ccfg.setReadThrough(true);
ccfg.setWriteThrough(true);
ccfg.setWriteBehindEnabled(true);
ccfg.setWriteBehindBatchSize(10000);
节点A首先从命令行启动,如下所示:
apache-ignite-fabric-2.2.0-bin>bin/ignite.bat config/default-config.xml
节点B通过运行从java代码启动
public static void main(String[] args) throws Exception {
Ignite ignite = Ignition.start(ServerConfigurationFactory.createConfiguration());
ignite.cache("MyCache").loadCache(null);
...
}
(包含ServerConfigurationFactory的jar放在apache-ignite-fabric-2.2.0-bin \ libs目录中,因此节点A和B位于同一个集群上 . 另外存在错误)
我有一个查询应该从数据库返回9061结果 . 在节点B中的缓存加载过程之后,我转到Web控制台并针对缓存运行了一个简单的计数SQL语句 . 有一个按钮"Execute on selected node",允许您选择要查询的特定缓存 . 我查询了Node A并获得了2341的计数,并且在Node BI上获得了2064的计数 . 如果我只使用"Execute"按钮,我得到的是4405,它只是节点A和B的总和 . 显然它们缺少4656条记录(9061) db-4405中节点A和B中的总记录 . 我还使用 SqlFieldsQuery
在Java代码中运行相同的计数查询,我也得到4405 .
由于readThrough设置为 true
,我希望Ignite也返回不在内存中的结果 . 但事实并非如此,因为它只返回缓存中的任何内容 . 我在这里做错了吗?谢谢 .
1 回答
Read虽然仅适用于键值API,但SQL引擎假定在运行查询之前从数据库预加载了所有必需的数据 .
如果您的数据集没有预加载所有数据,则可以使用本机Ignite持久性存储:https://apacheignite.readme.io/docs/distributed-persistent-store