Ignite內存數據庫與sql支持


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM