分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 代码编程

apache ignite系列(九):使用ddl和dml脚本初始化ignite并使用mybatis查询缓存

发布时间:2023-09-06 02:30责任编辑:彭小芳关键词:apache缓存

? 博客又断了一段时间,本篇将记录一下基于ignite对jdbc支持的特性在实际使用过程中的使用。

使用ddl和dml脚本初始化ignite

由于spring-boot中支持通过spring.datasource.schema属性指定初始化DDL脚本,spring.datasource.data指定初始化DML脚本。而ignite支持jdbc协议,测试了一下,发现一样可以通过该配置初始化ignite。

spring.datasource.url=jdbc:ignite:thin://127.0.0.1/spring.datasource.driver-class-name=org.apache.ignite.IgniteJdbcThinDriverspring.datasource.schema=classpath:db/schema.sqlspring.datasource.data=classpath:db/data.sql

说明ignite数据源同样可以作为一个DataSource实例。

DDL的规范

创建表

CREATE TABLE [IF NOT EXISTS] tableName (tableColumn [, tableColumn]...[, PRIMARY KEY (columnName [,columnName]...)])[WITH "paramName=paramValue [,paramName=paramValue]..."]

WITH语法中支持的选项以及含义如下(可参见xml配置中CacheConfiguration的相关配置):

参数含义
TEMPLATE缓存模式:PARTITIONED或者REPLICATED
BACKUPS备份数量
ATOMICITY原子模式:ATOMIC或者TRANSACTIONAL
CACHEGROUP缓存组名
AFFINITYKEY并置键列名
CACHE_NAME缓存名(如果不设置的话默认会加SQL_前缀)
KEY_TYPE键类型
VALUE_TYPE值类型
DATA_REGION内存区名

创建索引

CREATE [SPATIAL] INDEX [[IF NOT EXISTS] indexName] ON tableName ???(columnName [ASC|DESC] [,...]) [(index_option [...])]

示例:

schema.sql

--student学生信息表CREATE TABLE IF NOT EXISTS PUBLIC.STUDENT ( STUDID INTEGER, NAME VARCHAR, EMAIL VARCHAR, dob Date, PRIMARY KEY (STUDID))WITH "template=replicated,atomicity=ATOMIC,cache_name=student,key_type=java.lang.Long";CREATE INDEX IF NOT EXISTS STUDENT_NE_INDEX ON PUBLIC.STUDENT (NAME, EMAIL);-- grade成绩表CREATE TABLE IF NOT EXISTS PUBLIC.GRADE ( STUDID INTEGER, grade DOUBLE, PRIMARY KEY (STUDID))WITH "template=replicated,atomicity=ATOMIC,cache_name=grade,key_type=java.lang.Long";

DML规范

ignite中dml与标准sql中的基本一致,唯一区别在于ignite中底层是KV结构,所以insert语句可以处理key对应的值。示例如下:

INSERT INTO student (_key, studid, name, email, dob) VALUES (1, ‘1‘, ‘student_1‘, ‘student_1gmail.com‘, ‘2017-09-28‘);

完整dml初始化脚本:

-- studentINSERT INTO student (_key, studid, name, email, dob) VALUES (1, ‘1‘, ‘student_1‘, ‘student_1gmail.com‘, ‘2017-09-28‘);INSERT INTO student (_key, studid, name, email, dob) VALUES (2, ‘2‘, ‘student_2‘, ‘student_2gmail.com‘, ‘2017-09-28‘);...--gradeINSERT INTO grade (_key, studid, grade) VALUES (1, ‘1‘, ??3);INSERT INTO grade (_key, studid, grade) VALUES (2, ‘2‘, ??64);...

初始化完成后可通过监控程序看到如下监控情况 :


可以发现缓存和数据均已初始化成功。

使用Mybatis查询ignite缓存

由于ignite可以作为DataSource的实例,所以猜想应该也可以通过Mybatis去查询ignite,这样可以替代原来需要SqlFieldsQuery查询并对结果进行逐行解析的方式。经验证后发现ignite能完美支持myabtis,所以在查询ignite的方式上有了一个更便捷的方式。

与普通使用mybatis的方式一样,定义IgniteMapper.xmlIgniteMapper.java

IgniteMapper.xml

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper ???????PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ???????"http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="org.cord.ignite.data.mapper.IgniteMapper"> ???<resultMap type="org.cord.ignite.data.domain.Student" id="StudentResult"> ???????<result property="studId" column="studid"/> ???????<result property="name" column="name"/> ???????<result property="email" column="email"/> ???????<result property="dob" column="dob"/> ???</resultMap> ???<select id="findStudentsById" parameterType="java.lang.String" resultMap="StudentResult"> ???????SELECT * FROM student WHERE studid = #{studentId} ???</select> ???<select id="findGradeByName" parameterType="java.lang.String" resultType="java.lang.Double"> ???????SELECT g.grade FROM student s,grade g WHERE s.STUDID=g.STUDID and s.name= #{name} ???</select></mapper>

IgniteMapper.java

public interface IgniteMapper { ???/** ????* 根据studentId查询学生信息 ????* @param studentId ????* @return Student ????*/ ???Student findStudentsById(String studentId); ???/** ????* 根据学生姓名查询学生分数 ????* @param name ????* @return 学生分数 ????*/ ???Double findGradeByName(String name);}

查询:

 ???... ???@Autowired ???private IgniteMapper igniteMapper; ???... ???Student student = igniteMapper.findStudentsById(studentId); ???... ???double grade = igniteMapper.findGradeByName(name);

注:由于ignite中可以自定义sql函数,测试过,在mybatis中ignite的自定义sql函数同样支持。

性能

由于ignite中jdbc的方式属于轻客户端,所以性能要比api的方式差,而在通过mybatis查询的方式其性能表现通过测试得出的结果如下:

在相同的sql相同数据的情况下,100并发查询:

mybatis查询

/findStudentsById 耗时 [13]ms./findStudentsById 耗时 [9]ms./findStudentsById 耗时 [3]ms./findStudentsById 耗时 [10]ms./findStudentsById 耗时 [11]ms./findStudentsById 耗时 [11]ms./findStudentsById 耗时 [13]ms./findStudentsById 耗时 [8]ms./findStudentsById 耗时 [8]ms./findStudentsById 耗时 [14]ms./findStudentsById 耗时 [17]ms./findStudentsById 耗时 [11]ms./findStudentsById 耗时 [8]ms./findStudentsById 耗时 [13]ms./findStudentsById 耗时 [11]ms./findStudentsById 耗时 [10]ms./findStudentsById 耗时 [9]ms./findStudentsById 耗时 [10]ms./findStudentsById 耗时 [12]ms./findStudentsById 耗时 [9]ms./findStudentsById 耗时 [3]ms./findStudentsById 耗时 [3]ms..../findStudentsById 耗时 [1]ms./findStudentsById 耗时 [2]ms./findStudentsById 耗时 [2]ms./findStudentsById 耗时 [2]ms./findStudentsById 耗时 [2]ms./findStudentsById 耗时 [2]ms./findStudentsById 耗时 [2]ms./findStudentsById 耗时 [2]ms./findStudentsById 耗时 [1]ms./findStudentsById 耗时 [1]ms./findStudentsById 耗时 [1]ms./findStudentsById 耗时 [0]ms.

吞吐量为537/sec, 性能有波动情况,稳定后在2ms左右。

api查询

/cpFindStudentsById 耗时 [0]ms./cpFindStudentsById 耗时 [0]ms./cpFindStudentsById 耗时 [0]ms./cpFindStudentsById 耗时 [0]ms./cpFindStudentsById 耗时 [0]ms./cpFindStudentsById 耗时 [0]ms./cpFindStudentsById 耗时 [0]ms./cpFindStudentsById 耗时 [0]ms./cpFindStudentsById 耗时 [0]ms./cpFindStudentsById 耗时 [0]ms./cpFindStudentsById 耗时 [0]ms./cpFindStudentsById 耗时 [1]ms./cpFindStudentsById 耗时 [0]ms./cpFindStudentsById 耗时 [0]ms./cpFindStudentsById 耗时 [1]ms./cpFindStudentsById 耗时 [0]ms./cpFindStudentsById 耗时 [0]ms./cpFindStudentsById 耗时 [0]ms./cpFindStudentsById 耗时 [0]ms.

吞吐量为1256/sec,性能比较稳定,稳定后在1ms以内。

完整代码请参考:https://github.com/cording/ignite-example

结论

? 对于不是要求极限性能的场景,mybatis查询方式完全能满足,这使得对于很多现有基于myabtis的项目代码,能相对平滑的使用ignite作为加速层,而又不用做过多改动。

? 还有,写博客确实有点费时间....................

apache ignite系列(九):使用ddl和dml脚本初始化ignite并使用mybatis查询缓存

原文地址:https://www.cnblogs.com/cord/p/10293813.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved