Ignite采用h2作为内存数据库,支持h2的一切sql语法。如果是本地缓存或者复制缓存,sql执行直接在本地h2数据库中执行,如果是分区缓存,ignite则会分解sql到多个h2数据库执行后再汇总。

通过@QuerySqlField注解可以轻松的把对象属性映射到表字段,下述代码实现了缓存对象与h2表的映射关系:

1、 class

package com.coshaho.learn.ignite.sql;

import org.apache.ignite.cache.query.annotations.QuerySqlField;

public class Class
{
@QuerySqlField(index = true)
private int id; @QuerySqlField
private String name; private int level; public Class(int id, String name)
{
this.id = id;
this.name = name;
}
public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
@Override
public String toString() {
return "Class [id=" + id + ", name=" + name + ", level=" + level + "]";
}
}

2、 Student

package com.coshaho.learn.ignite.sql;

import org.apache.ignite.cache.query.annotations.QuerySqlField;

public class Student
{
@QuerySqlField
private int classId; @QuerySqlField
private String name; @QuerySqlField
private int age; public Student(int classId, String name, int age)
{
this.classId = classId;
this.name = name;
this.age = age;
} public int getClassId() {
return classId;
} public void setClassId(int classId) {
this.classId = classId;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "Student [classId=" + classId + ", name=" + name + ", age="
+ age + "]";
}
}

要把缓存对象存储到h2表中,还必须设置缓存的IndexedTypes,IndexedTypes必须成对出现,并且和缓存键值对类型相同。

Ignite还支持不同缓存之间的关联查询,查询时把缓存名当做h2 schema就行,缓存关联查询时需要把缓存名设置为大写(应该是ignite bug)。

测试代码如下:

package com.coshaho.learn.ignite.sql;

import java.util.List;

import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.Ignition;
import org.apache.ignite.cache.CacheMode;
import org.apache.ignite.cache.query.QueryCursor;
import org.apache.ignite.cache.query.SqlFieldsQuery;
import org.apache.ignite.configuration.CacheConfiguration; /**
*
* IgniteDB.java Create on 2017年5月25日 下午11:00:35
*
* 类功能说明: ignite内存数据库
*
* Copyright: Copyright(c) 2013
* Company: COSHAHO
* @Version 1.0
* @Author coshaho
*/
public class IgniteDB
{
public static void main(String[] args)
{
Ignite ignite = Ignition.start();
CacheConfiguration<Integer, Class> classCfg = new CacheConfiguration<Integer, Class>();
classCfg.setName("CLA");
classCfg.setCacheMode(CacheMode.PARTITIONED);
classCfg.setIndexedTypes(Integer.class, Class.class);
IgniteCache<Integer, Class> classCache = ignite.getOrCreateCache(classCfg);
classCache.put(1, new Class(1, "五年级一班"));
classCache.put(2, new Class(2, "五年级二班")); CacheConfiguration<Integer, Student> stuCfg = new CacheConfiguration<Integer, Student>();
stuCfg.setName("STU");
stuCfg.setCacheMode(CacheMode.PARTITIONED);
stuCfg.setIndexedTypes(Integer.class, Student.class);
IgniteCache<Integer, Student> stuCache = ignite.getOrCreateCache(stuCfg);
stuCache.put(1, new Student(1, "张三", 10));
stuCache.put(2, new Student(1, "李四", 11));
stuCache.put(3, new Student(2, "王五", 11));
stuCache.put(4, new Student(2, "胜七", 10)); SqlFieldsQuery sql = new SqlFieldsQuery(
"select concat(stu.classId, '----', stu.name) as stuinfo"
+ " "
+ "from Student as stu "
+ ""); QueryCursor<List<?>> cursor = stuCache.query(sql);
for (List<?> row : cursor)
{
System.out.println("学生信息:" + row.get(0));
} SqlFieldsQuery sql1 = new SqlFieldsQuery(
"select concat(cla.id, '----', cla.name) as clainfo"
+ ", concat(stu.name, '----', stu.age) as stuinfo "
+ "from Class as cla, STU.Student as stu "
+ "where cla.id = stu.classId"); QueryCursor<List<?>> cursor1 = classCache.query(sql1);
for (List<?> row : cursor1)
{
System.out.println("班级信息:" + row.get(0) + ", 学生信息:" + row.get(1));
}
}
}

测试结果:

[23:02:08] Ignite node started OK (id=6073a91e)
[23:02:08] Topology snapshot [ver=1, servers=1, clients=0, CPUs=4, heap=0.88GB]
学生信息:1----张三
学生信息:1----李四
学生信息:2----王五
学生信息:2----胜七
班级信息:1----五年级一班, 学生信息:张三----10
班级信息:1----五年级一班, 学生信息:李四----11
班级信息:2----五年级二班, 学生信息:王五----11
班级信息:2----五年级二班, 学生信息:胜七----10

可以看出来,ignite对sql的支持非常强大,对于需要频繁进行数据库操作的场景,ignite缓存相当有效。

 

Ignite内存数据库与sql支持的更多相关文章

  1. ignite中的sql查询

    ignite中进行sql查询需要对要查询的cache和字段进行配置,可以在xml中配置,也可以在代码中配置或进行注解,我用的是xml配置: <!-- 配置cache --> <pro ...

  2. Spark SQL 编程API入门系列之Spark SQL支持的API

    不多说,直接上干货! Spark SQL支持的API SQL DataFrame(推荐方式,也能执行SQL) Dataset(还在发展) SQL SQL 支持basic SQL syntax/Hive ...

  3. Druid.io启用SQL支持

    Druid.io的SQL功能虽然在试验阶段,但是也支持了大部分的功能,而且还可以通过 Avatica JDBC查看请求的json,有助于我们理解Druid.io的语法.Druid.io有个比较坑的是, ...

  4. Citus 分布式 PostgreSQL 集群 - SQL Reference(SQL支持和变通方案)

    由于 Citus 通过扩展 PostgreSQL 提供分布式功能,因此它与 PostgreSQL 结构兼容.这意味着用户可以使用丰富且可扩展的 PostgreSQL 生态系统附带的工具和功能来处理使用 ...

  5. 微服务追踪SQL(支持Isto管控下的gorm查询追踪)

    效果图 SQL的追踪正确插入到微服务的调用链之间 详细记录了SQL的执行内容和消耗时间 搜索SQL的类型 多线程(goroutine)下的追踪效果 在 Kubernetes 中部署微服务后,通过 Is ...

  6. Esper——内存计算、事件驱动、SQL支持

    教程简介Esper是一个事件流处理(ESP)和事件关联引擎(CEP的,复杂事件处理).Esper的目标是针对实时事件驱动架构(EDA).当Esper监测到事件流中又符合条件的时间发生时,即可触发Pla ...

  7. SQL Server 2014 新特性——内存数据库

    SQL Server 2014 新特性——内存数据库 目录 SQL Server 2014 新特性——内存数据库 简介: 设计目的和原因: 专业名词 In-Memory OLTP不同之处 内存优化表 ...

  8. Apache Ignite 学习笔记(一): Ignite介绍、部署安装和REST/SQL客户端使用

    Apache Ignite 介绍 Ignite是什么呢?先引用一段官网关于Ignite的描述: Ignite is memory-centric distributed database, cachi ...

  9. LINQ体验(18)——LINQ to SQL语句之视图和继承支持

    视图 我们使用视图和使用数据表类似,仅仅需将视图从"server资源管理器/数据库资源管理器"拖动到O/R 设计器上,自己主动能够创建基于这些视图的实体类.我们能够同操作数据表一样 ...

随机推荐

  1. mysql count(*) 和count(列) 的区别

    count(*) 是统计包含null的记录,而count(列)不含null; 在不带where的情况下count(*)与count(列)相比,并非统计所有列,而是忽略所有列而直接统计行数; 当coun ...

  2. ubuntu常用技巧积累

    1.修改root密码,一般与用户密码不同 python@ubuntu:~$ sudo passwd[sudo] password for python: 输入新的 UNIX 密码: 重新输入新的 UN ...

  3. SQL Fundamentals: 子查询 || 行列转换(PIVOT,UNPIVOT,DECODE),设置数据层次(LEVEL...CONNECT BY)

    SQL Fundamentals || Oracle SQL语言 子查询(基础) 1.认识子查询 2.WHERE子句中使用子查询 3.在HAVING子句中使用子查询 4.在FROM子句中使用子查询 5 ...

  4. SQL Fundamentals || Single-Row Functions || 字符函数 character functions

    SQL Fundamentals || Oracle SQL语言   SQL Fundamentals: Using Single-Row Functions to Customize Output使 ...

  5. Java不定参数

    先看两个简单的例子,来感受一下Java的不定长度参数 第一个例子: public class VariArgs { public static void main(String[] args) { t ...

  6. 用栈来递归 模板 honoi

    用栈来模拟递归的技巧 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<vector> #include& ...

  7. dockerfile学习笔记

    Dockfile 参考资料:http://www.cnblogs.com/CloudMan6/p/6864000.html http://www.cnblogs.com/CloudMan6/p/687 ...

  8. 卸载重装ArcGIS Enterprise 注意事项

    ArcGIS Enterprise ,通俗的讲,即“ArcGIS Server 10.5+ 版本” 强烈建议参考文档: windows环境安装ArcGIS Enterprise ,http://zhi ...

  9. wordpress注册后重定向到自定义页面

    wordpress注册后重定向到自定义页面怎么操作?将下面的代码添加到当前主题的 functions.php 文件中即可 add_filter( 'registration_redirect', 'w ...

  10. 【剑指offer】斐波那契数列

    一.题目: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.n<=39 二.思路: 式子: n=0时,f=0:n=1或者n=2时f=1:否则f=f(n-1)+f(n ...