如何通过sqlline查询Ignite中getOrCreateCache创建的缓存?
如何用sqlline查询通过
ignite.getOrCreateCache()创建的Ignite缓存 你遇到的问题其实很常见:ignite.getOrCreateCache()默认创建的是纯键值对缓存,而sqlline是基于SQL表的逻辑来操作的——Ignite需要明确这个缓存对应的SQL元数据(表结构),才能让sqlline识别并查询它。好在你已经能用SqlFieldsQuery正常查询,说明你的缓存其实已经带有SQL元数据了,只是需要让sqlline“看到”它。
下面分两种情况解决:
情况1:创建缓存时已经配置了SQL元数据(比如用注解或QueryEntity)
如果你的代码里是通过注解实体类(比如给实体字段加@QuerySqlField,类加@QuerySqlEntity),或者在CacheConfiguration里显式配置了QueryEntity,那缓存创建后,Ignite已经自动在SQL系统中注册了对应的表。
这时候你只需要:
- 打开sqlline,连接到Ignite集群
- 先执行
SHOW TABLES;,就能看到对应的表名(默认是实体类的简单类名,或者你在QueryEntity里指定的tableName) - 直接用SQL查询即可,比如:
SELECT id, name FROM User WHERE age > 30;
情况2:缓存已创建,但未预先配置SQL元数据
如果你的缓存是纯键值对缓存(没有配置QueryEntity或注解),但你想通过sqlline查询,可以通过CREATE TABLE语句关联已有缓存,语法如下:
CREATE TABLE IF NOT EXISTS 表名 ( 列定义(注意主键要和缓存键对应) ) WITH "CACHE_NAME=你的缓存名, KEY_TYPE=缓存键的全类名, VALUE_TYPE=缓存值的全类名";
举个实际例子:假设你的缓存名为userCache,键是java.lang.Long,值是自定义类com.example.User(包含id(Long)、name(String)、age(Integer)字段),可以执行:
CREATE TABLE IF NOT EXISTS users ( id BIGINT PRIMARY KEY, name VARCHAR, age INT ) WITH "CACHE_NAME=userCache, KEY_TYPE=java.lang.Long, VALUE_TYPE=com.example.User";
执行后,再用SHOW TABLES;就能看到users表,之后就可以正常查询了。
关键注意点(针对Ignite 2.3.0)
- SQL表的主键必须和缓存的键类型、字段对应,否则会报错
- 如果缓存的值是自定义类,要确保sqlline所在的节点能访问到这个类的字节码(比如把包含该类的jar包加到Ignite的类路径里)
- 如果你用的是分区缓存,要确保SQL查询的过滤条件包含分区键,这样性能会更好
内容的提问来源于stack exchange,提问作者scottmf
相关产品推荐
相关产品推荐

