Java 无法使用SQL工具查询现有Ignite缓存

Java 无法使用SQL工具查询现有Ignite缓存,java,sql,caching,ignite,dbeaver,Java,Sql,Caching,Ignite,Dbeaver,我正在尝试查询Apache Ignite缓存(版本2.2),该缓存是通过Java脚本创建的: TcpDiscoverySpi spi = new TcpDiscoverySpi(); TcpDiscoveryVmIpFinder ipFinder=new TcpDiscoveryMulticastIpFinder(); List<String> adresses=new ArrayList<String>(); adresses.add("

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

    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();
如果运行此查询,则相同:

SELECT * FROM Spark_Ignite;

 Table "Spark_Ignite" not found; SQL statement:SELECT * FROM Spark_Ignite
但是,如果我按照这里提到的说明进行操作,我将获得没有问题的查询结果

我运行了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;
}

为了能够将缓存与SQL一起使用,它需要:

  • 使用
    CREATE TABLE
    DML创建。在这种情况下,模式是公共的,这通常是默认的
  • 在其
    缓存配置
    中指定
    索引类型
    ,以及这些类型上的注释。在本例中,模式是
    “cacheName”
    ,引号很重要,表名是
    VALUETYPEINCAPS
    。如果键是基元类型,则其字段名为
    \u键
    ,如果值是基元类型,则其字段名为
    \u值
    ,它们被排除在
    *
    之外
  • 在其
    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
工具中的表。

为了能够将缓存与SQL一起使用,它需要:

  • 使用
    CREATE TABLE
    DML创建。在这种情况下,模式是公共的,这通常是默认的
  • 在其
    缓存配置
    中指定
    索引类型
    ,以及这些类型上的注释。在本例中,模式是
    “cacheName”
    ,引号很重要,表名是
    VALUETYPEINCAPS
    。如果键是基元类型,则其字段名为
    \u键
    ,如果值是基元类型,则其字段名为
    \u值
    ,它们被排除在
    *
    之外
  • 在其
    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
工具中的表。

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


有关详细信息,请参阅文档中的下一页:

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


有关更多信息,请参阅文档中的下一页:

我不确定您是否可以将架构设置为
PUBLIC
。我记得这是个禁忌。@alamar,是的,你可以。事实上,这就是我一直在做的:)@Denis,谢谢你的回答,确实是缺少了引语。但是,当我查询时,我没有看到任何记录,并且在ignitevisor中清楚地显示,该表中有63条记录,您知道为什么会出现这种情况吗?@manuelmourato您可以提供自定义类和代码的内容,用于用数据填充缓存吗?我认为,您的问题可能是由于类的字段上缺少QuerySqlField注释引起的。@Denis我已经用内容更新了问题,但我确保在每个字段之前添加QuerySqlField,所以我不相信这就是问题所在……我不确定您是否可以将架构设置为
PUBLIC
。我记得这是个禁忌。@alamar,是的,你可以。事实上,这就是我一直在做的:)@Denis,谢谢你的回答,确实是缺少了引语。但是,当我查询时,我没有看到任何记录,并且在ignitevisor中清楚地显示,该表中有63条记录,您知道为什么会出现这种情况吗?@manuelmourato您可以提供自定义类和代码的内容,用于用数据填充缓存吗?我认为,您的问题可能是由于类的字段上缺少QuerySqlField注释造成的。@Denis我已经用内容更新了问题,但我确保在每个字段之前添加QuerySqlField,因此我不相信这就是问题所在……谢谢,我将接受您的回答。由于将缓存名称放在“”中起作用,因此我可以查询缓存。然而由于某种原因,我所有的记录都是空白的,你知道为什么会这样吗?如图所示,我应该看到63records@manuelmourato这应该是因为缓存不包含自定义类的字符串,而是包含一些其他类型的字符串。仔细检查类型。
INSERT
有效吗?我已经创建了另一个问题,详细说明了如何将数据插入缓存,如果您看一下,我将不胜感激,谢谢:谢谢,我将接受您的回答。由于将缓存名称放在“”中起作用,因此我可以查询缓存。然而由于某种原因,我所有的记录都是空白的,你知道为什么会这样吗?如图所示,我应该看到63records@manuelmourato这应该是因为缓存不包含自定义类的字符串,而是包含一些其他类型的字符串。仔细检查类型。
INSERT
有效吗?我已经提出了另一个问题,详细说明了如何将数据插入缓存,如果您能看一下,我将不胜感激,谢谢: