apache点燃查询

Posted

技术标签:

【中文标题】apache点燃查询【英文标题】:apache ignite query 【发布时间】:2015-09-07 08:25:51 【问题描述】:

我使用自动持久性创建了一个缓存,连接到 mysql 数据库。 启动时将 100 万行填充到该节点中。节点处于分区模式

当我尝试使用 SQL 查询从该缓存中检索数据时,它总是返回空数组。 我已经使用“CacheTypeMetadata”为缓存建立了索引。

请任何人指出我错过了什么或做错了什么。我一直在关注教程,但我无法弄清楚为什么我的查询不能正常工作。

提前致谢!

缓存:

CacheConfiguration<Dataloadermd5Key, DataLoaderMd5> cfg =
                        CacheConfigMd5.cache("DataMd5Cache", 
                            new JDBCFactory<Dataloadermd5Key, DataLoaderMd5>());

DataLoaderMd5Key:

public class Dataloadermd5Key implements Serializable 
    /** */
    private static final long serialVersionUID = 0L;

    /** Value for idClient. */
    private int idClient;

    /** Value for clientPropId. */
    private String clientPropId;
    //...

DataLoaderMd5:

public class DataLoaderMd5 implements Serializable 
    /** */
    private static final long serialVersionUID = 0L;

    /** Value for idClient. */
    private int idClient;

    /** Value for clientPropId. */
    private String clientPropId;

    /** Value for md5. */
    private String md5;
    //...

CacheConfigMd5:

public static <K, V> CacheConfiguration<K, V> cache(String name,
                                                    Factory<CacheStore<K, V>> storeFactory) 
    if (storeFactory == null)
        throw new IllegalArgumentException("Cache store factory cannot be null.");

    CacheConfiguration<K, V> ccfg = new CacheConfiguration<>(name);

    ccfg.setCacheStoreFactory(storeFactory);
    ccfg.setReadThrough(true);
    ccfg.setWriteThrough(true);

    // Configure cache types. 
    Collection<CacheTypeMetadata> meta = new ArrayList<>();

    // DataLoaderMd5.
    CacheTypeMetadata type = new CacheTypeMetadata();

    meta.add(type);

    type.setDatabaseSchema("abc");
    type.setDatabaseTable("dfg");
    type.setKeyType(Dataloadermd5Key.class.getName());
    type.setValueType(DataLoaderMd5.class.getName());

    // Key fields for DataLoaderMd5.
    Collection<CacheTypeFieldMetadata> keys = new ArrayList<>();
    keys.add(new CacheTypeFieldMetadata("id_client", Types.INTEGER,
            "idclient", int.class));
    keys.add(new CacheTypeFieldMetadata("client_prop_id", Types.VARCHAR,
            "clientPropId", String.class));
    type.setKeyFields(keys);

    // Value fields for DataLoaderMd5.
    Collection<CacheTypeFieldMetadata> vals = new ArrayList<>();
    vals.add(new CacheTypeFieldMetadata("id_client", Types.INTEGER,
            "idclient", int.class));
    vals.add(new CacheTypeFieldMetadata("client_prop_id", Types.VARCHAR,
            "clientPropId", String.class));
    vals.add(new CacheTypeFieldMetadata("Md5", Types.VARCHAR,
            "md5", String.class));
    type.setValueFields(vals);

    // Query fields for DataLoaderMd5.
    Map<String, Class<?>> qryFlds = new LinkedHashMap<>();

    qryFlds.put("idclient", int.class);
    qryFlds.put("clientPropId", String.class);
    qryFlds.put("md5", String.class);

    type.setQueryFields(qryFlds);

    // Groups for DataLoaderMd5.
    Map<String, LinkedHashMap<String,
            IgniteBiTuple<Class<?>, Boolean>>> grps = new LinkedHashMap<>();

    LinkedHashMap<String, IgniteBiTuple<Class<?>, Boolean>> grpItems =
            new LinkedHashMap<>();

    grpItems.put("idclient", new IgniteBiTuple<Class<?>,
            Boolean>(int.class, false));
    grpItems.put("clientPropId", new IgniteBiTuple<Class<?>,
            Boolean>(String.class, false));

    grps.put("PRIMARY", grpItems);

    type.setGroups(grps);

    ccfg.setTypeMetadata(meta);

    return ccfg;

查询:

Ignite ignite = Ignition.start("examples/config/example-cache.xml");
 IgniteCache<Dataloadermd5Key, DataLoaderMd5> cache = ignite.cache(CACHE_NAME);
  Dataloadermd5Key key = new Dataloadermd5Key();
    key.setIdClient(98255);
    key.setClientPropId("1000008");

 SqlQuery<Dataloadermd5Key, DataLoaderMd5> qry =
        new SqlQuery<Dataloadermd5Key, DataLoaderMd5>(
            DataLoaderMd5.class, "idClient = ? and clientPropId = ?");



//Excecute query
System.out.println("sqlQuery Lookup result :: " +
        cache.query(qry).getAll());

System.out.println("sqlQuery Lookup result :: " +
        cache.query(qry.setArgs(key.getIdClient(), key.getClientPropId())).getAll());

【问题讨论】:

【参考方案1】:

我发现了问题。这是因为我的 Ignite 版本。 我将 maven 上的版本更新为 1.1.0,代码开始正常工作。

 <dependency>
        <groupId>org.apache.ignite</groupId>
        <artifactId>ignite-indexing</artifactId>
        <version>1.1.0-incubating</version>
    </dependency>

【讨论】:

以上是关于apache点燃查询的主要内容,如果未能解决你的问题,请参考以下文章

点燃扫描查询问题

如何在服务器端数据表中编写子查询 [点燃数据表]

如何获取缓存数据Apache点燃

如何通过静态IP地址连接apache点燃节点

Apache点燃了odbc / jdbc驱动程序初始化的原因

点燃odbc SQLSTATE [01000]错误如何解决?