【问题标题】:Cannot query existing Ignite cache using SQL tooling无法使用 SQL 工具查询现有的 Ignite 缓存
【发布时间】:2018-04-03 16:51:33
【问题描述】:

我正在尝试查询我通过 Java 脚本创建的 Apache Ignite 缓存(2.2 版):

    TcpDiscoverySpi spi = new TcpDiscoverySpi();
    TcpDiscoveryVmIpFinder ipFinder=new TcpDiscoveryMulticastIpFinder();
    List<String> adresses=new ArrayList<String>();
    adresses.add("127.0.0.1:48500..48520");
    ipFinder.setAddresses(adresses);
    spi.setIpFinder(ipFinder);

    IgniteConfiguration cfg=new IgniteConfiguration().setDiscoverySpi(spi).setClientMode(true);

    CacheConfiguration cache_conf=new CacheConfiguration<String,Custom_Class>().setCacheMode(CacheMode.PARTITIONED).setAtomicityMode(CacheAtomicityMode.ATOMIC).setBackups(1).
            setIndexedTypes(String.class,Custom_Class.class).setName("Spark_Ignite");

    Ignite ignite=Ignition.getOrStart(cfg);

    ignite.getOrCreateCache(cache_conf);

    System.out.println("[INFO] CACHE CREATED");
    ignite.close();

我正在使用 DBeaver 对该缓存执行简单的 SQL 查询。

问题是,当我尝试进行查询时,我得到了这个错误:

SELECT * FROM Custom_Class;

 Table "Custom_Class" not found; SQL statement:SELECT * FROM Custom_Class

如果我运行这个查询也是一样:

SELECT * FROM Spark_Ignite;

 Table "Spark_Ignite" not found; SQL statement:SELECT * FROM Spark_Ignite

但是,如果我按照此处提到的说明进行操作:https://apacheignite-sql.readme.io/docs/sql-tooling,我可以毫无问题地获得查询结果。

我跑了 ignitevisor.sh,果然所有的缓存都在那里,而且都有记录:

这里可能有什么问题?

谢谢。

更新

使用答案中提到的引号,我能够查询该表,但它没有显示任何记录,而 ignitevisor 显示 63。 这是我在课堂上使用的脚本:

public class Custom_Class implements Serializable {
@QuerySqlField(index = true)
private String a;

@QuerySqlField(index = true)
private String b;

@QuerySqlField(index = true)
private String c;

@QuerySqlField(index = true)
private String d;

@QuerySqlField(index = true)
private String e;

@QuerySqlField(index = true)
private String f;

@QuerySqlField(index = true)
private String g;

@QuerySqlField(index = true)
private String h;
}

【问题讨论】:

    标签: java sql caching ignite dbeaver


    【解决方案1】:

    为了能够在 SQL 中使用缓存,它需要是:

    • 使用CREATE TABLE DML 创建。在这种情况下,架构是 PUBLIC,通常是默认值。
    • 在其cacheConfiguration 中指定indexedTypes,以及这些类型的注释。在这种情况下,架构是"cacheName",引号很重要,表名是VALUETYPEINCAPS。如果 key 是原始类型,它的字段名称是 _key,如果 value 是原始类型,它将是 _val,它们被排除在 * 之外。
    • 在其cacheConfiguration 中指定了queryEntities。在这种情况下,您可以为原始类型指定表名和列名,但架构是"cacheName"

    如果缓存是在没有 SQL 支持的情况下创建的,则只能通过销毁和重新创建缓存来添加它。

    我可以看到您的缓存具有索引类型。现在,怎么样:

    INSERT INTO "Spark_Ignite".CUSTOM_CLASS(_key, id) VALUES ('foo', 1);
    SELECT _key, * FROM "Spark_Ignite".CUSTOM_CLASS;
    

    您也可以尝试在 Apache Ignite 附带的 sqlline 工具中调用 !tables。

    【讨论】:

    • 谢谢,我会接受你的回答。因为将缓存名称放在“”中,所以我可以查询缓存。但是由于某种原因,我所有的记录都是空白的,你知道为什么会这样吗?正如 ignitevisor 所说,我应该看到 63 条记录
    • @manuelmourato 这应该是因为您的缓存不包含自定义类的字符串,而是一些其他类型。仔细检查类型。 INSERT 有效吗?
    • 我已经创建了另一个关于如何将数据插入缓存的具体问题,如果您看一下,将不胜感激,谢谢:stackoverflow.com/questions/49652724/…
    【解决方案2】:

    您应该将CacheConfiguration#sqlSchema 属性设置为PUBLIC,或者使用带引号的缓存名称作为DBeaver 中的架构名称。

    有关详细信息,请参阅文档中的以下页面:https://apacheignite-sql.readme.io/docs/schema-and-indexes

    【讨论】:

    • 我实际上不确定您是否可以将架构设置为 PUBLIC。我记得这是一个禁忌。
    • @alamar,是的,你可以。这实际上是我一直在做的:)
    • @Denis,谢谢您的回答,确实是缺少引号。但是,我查询的时候没有看到任何记录,而且在ignitevisor中明确说该表有63条记录,你知道这是为什么吗?
    • @manuelmourato 您能否提供您的 Custom_Class 和代码的内容,用于在缓存中填充数据?我认为,您的问题可能是由于缺少类字段上的 QuerySqlField 注释引起的。
    • @Denis 我已经用内容更新了问题,但我确保在每个字段之前添加 QuerySqlField,所以我不相信这是问题所在......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 2023-01-22
    • 1970-01-01
    • 2021-02-05
    • 2022-08-16
    • 1970-01-01
    • 2016-03-22
    相关资源
    最近更新 更多