为两个客户端点燃SqlQuery

时间:2017-11-17 11:40:51

标签: sql ignite

我使用第三方持久性的Ignite缓存使用下一个进程:

  1. 空数据库
  2. 以服务器模式启动两个实例
  3. 以客户端模式启动第一个实例。
  4. 客户在循环中
    • 创建实体
    • 通过简单的SqlQuery
    • 读取实体
  5. 到目前为止还可以。所有代码都能正常运行。

    然后我在客户端模式下启动第二个实例。代码是一样的。 第二个客户也在周期

    • 创建实体
    • 通过SqlQuery
    • 读取实体

    第二个客户端获取空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>
    

2 个答案:

答案 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>