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緩存相當有效。