我使用第三方持久性的Ignite缓存使用下一个进程:
到目前为止还可以。所有代码都能正常运行。
然后我在客户端模式下启动第二个实例。代码是一样的。 第二个客户也在周期
第二个客户端获取空ResultSet。虽然第一个客户端仍然正确读取数据。 BTW。两个客户端都可以通过密钥获取实体。
关闭内存中的所有数据。
那么为什么第二个客户端无法通过SqlQuery读取?
下面是三个代码选项。所有这些都是相同的:第一个启动的客户端总是得到正确的结果。第二个启动的客户端始终为空ResultSet。
SqlQuery<EntryKey, Entry> sql = new SqlQuery<>(Entry.class, "accNumber = ?");
sql.setArgs(number);
List<Cache.Entry<EntryKey, Entry>> res = entryCache.query(sql).getAll();
...
SqlFieldsQuery sql = new SqlFieldsQuery("select d_c, summa from Entry where accNumber = ?");
sql.setArgs(number);
List<List<?>> res = entryCache.query(sql).getAll();
...
SqlQuery<BinaryObject, BinaryObject> query = new SqlQuery<>(Entry.class, "accNumber = ?");
QueryCursor<Cache.Entry<BinaryObject, BinaryObject>> entryCursor = binaryEntry
.query(query.setArgs(number));
List<javax.cache.Cache.Entry<BinaryObject, BinaryObject>> res = entryCursor.getAll();
XML配置如下:
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<!-- Set a cache name. -->
<property name="name" value="entryCache" />
<!-- Set cache mode. -->
<property name="cacheMode" value="PARTITIONED" />
<property name="atomicityMode" value="TRANSACTIONAL" />
<!-- Number of backup nodes. -->
<property name="backups" value="1" />
<property name="cacheStoreFactory">
<bean class="javax.cache.configuration.FactoryBuilder"
factory-method="factoryOf">
<constructor-arg
value="ru.raiffeisen.cache.store.jdbc.CacheJdbcEntryStore" />
</bean>
</property>
<property name="readThrough" value="true" />
<property name="writeThrough" value="true" />
<property name="queryEntities">
<list>
<bean class="org.apache.ignite.cache.QueryEntity">
<!-- Setting indexed type's key class -->
<property name="keyType"
value="ru.raiffeisen.cache.repository.EntryKey" />
<!-- Setting indexed type's value class -->
<property name="valueType" value="ru.raiffeisen.cache.repository.Entry" />
<!-- Defining fields that will be either indexed or queryable. Indexed
fields are added to 'indexes' list below. -->
<property name="fields">
<map>
<entry key="key.accNumber" value="java.lang.String" />
<entry key="key.d_c" value="ru.raiffeisen.cache.repository.EntryKey.DEB_CRE" />
<entry key="key.valuedate" value="java.util.Date" />
<entry key="summa" value="java.lang.Integer " />
</map>
</property>
<!-- Defining indexed fields. -->
<property name="indexes">
<list>
<!-- Single field (aka. column) index -->
<bean class="org.apache.ignite.cache.QueryIndex">
<constructor-arg value="key.accNumber" />
</bean>
</list>
</property>
</bean>
</list>
</property>
</bean>
答案 0 :(得分:0)
如果是第三方商店,readThrough仅适用于键值API,对于SQL,您需要在对Ignite执行查询之前运行loadCache method。
如果你想使用持久性的磁盘读取,我建议使用Ignite本机持久性存储:https://apacheignite.readme.io/docs/distributed-persistent-store
另外,我在你的配置中看到了:
<property name="indexedTypes" value="true" />
这绝对是一个错误,它应该配置为:
<property name="indexedTypes">
<list>
<value>java.lang.Integer</value>
<value>java.lang.Long</value>
</list>
</property>
IndexedTypes和QueryEntity配置相同的东西,实际上,在内部,IndexedTypes将创建QueryEntity的配置。因此,配置两者都是多余的。
答案 1 :(得分:0)
感谢大家的建议。
我实现了一个可以提供稳定和正确结果的选项。
实际上我将字段 accNumber 从键类移到了值类。所以现在select会根据值类的原始字段进行过滤。
查询配置:
<bean class="org.apache.ignite.cache.QueryEntity">
<!-- Setting indexed type's key class -->
<property name="keyType"
value="ru.raiffeisen.cache.repository.EntryKey" />
<!-- Setting indexed type's value class -->
<property name="valueType" value="ru.raiffeisen.cache.repository.Entry" />
<!-- Defining fields that will be either indexed or queryable. Indexed
fields are added to 'indexes' list below. -->
<property name="fields">
<map>
<entry key="accNumber" value="java.lang.String" />
<entry key="key.d_c" value="ru.raiffeisen.cache.repository.EntryKey.DEB_CRE" />
<entry key="key.valuedate" value="java.util.Date" />
<entry key="summa" value="java.lang.Integer " />
</map>
</property>
<!-- Defining indexed fields. -->
<property name="indexes">
<list>
<!-- Single field (aka. column) index -->
<bean class="org.apache.ignite.cache.QueryIndex">
<constructor-arg value="accNumber" />
</bean>
</list>
</property>
</bean>