一周前,MyBatis和Apache ignite 宣布支持apache ignite作为MyBatis缓存(L2缓存)。

从技术上讲,MyBatis支持两个级别的缓存:

  1. 本地缓存,默认情况下始终启用
  2. L2缓存,可选

随着Apache Ignite项目的各种功能Swift发展,在本博文中,我们将详细研究MyBatis支持。

第二级缓存存储实体数据,但不存储实体或对象本身。 数据以“序列化”格式存储,看起来像哈希图,其中键是实体ID,而值是原始值列表。

这是一个示例,其缓存条目在Apache ignite中的样子:


哪里:

  • 快取金钥

    CacheKey [idHash=1499858, hash=2019660929, checksum=800710994, count=6, multiplier=37, hashcode=2019660929, updateList=[com.blu.ignite.mapper.UserMapper.getUserObject, 0, 2147483647, SELECT * FROM all_objects t where t.OBJECT_TYPE='TABLE' and t.object_name=?, USERS, SqlSessionFactoryBean]]
  • 值类别java.util.ArrayList
  • 缓存值
    [UserObject [idHash=243119413, hash=1658511469, owner=C##DONOTDELETE, object_type=TABLE, object_id=94087, created=Mon Feb 15 13:59:41 MSK 2016, object_name=USERS]]

对于示例,我从Oracle数据库中选择了“ all_objects”对象和以下查询

SELECT count(*) FROM all_objects;SELECT * FROM all_objects t where t.OBJECT_TYPE='TABLE' and t.object_name='EMP';SELECT * FROM all_objects t where t.OBJECT_TYPE='TABLE';

就我而言,给定的查询执行时间平均约为660毫秒。

SELECT count(*) FROM all_objects;

接下来的下一个查询执行时间超过700ms:

SELECT t.object_type, count(*) FROM all_objects t group by t.OBJECT_TYPE;

让我们添加apache ignite作为第二级缓存并检查结果。 如果您想知道如何使用spring和myBatis安装和配置apache ignite,请参阅我以前的博客文章 。 此外,您可以在github存储库中找到所有源代码。

首先,让我们在项目中添加myBatis maven依赖项。

<dependency><groupId>org.mybatis.caches</groupId><artifactId>mybatis-ignite</artifactId><version>1.0.0-beta1</version>
</dependency>

然后,只需在映射器XML中指定它,如下所示

<mapper namespace="com.blu.ignite.mapper.UserMapper"><cache type="org.mybatis.caches.ignite.IgniteCacheAdapter" /><select id="getUserObject" parameterType="String" resultType="com.blu.ignite.dto.UserObject" useCache="true">SELECT * FROM all_objects t where t.OBJECT_TYPE='TABLE' and t.object_name=#{objectName}</select><select id="getAllObjectsTypeByGroup" parameterType="String" resultType="com.blu.ignite.dto.UobjectGroupBy" useCache="true">SELECT t.object_type, count(*) as cnt FROM all_objects t group by t.OBJECT_TYPE</select><select id="allObjectCount" parameterType="String" resultType="String" useCache="true">SELECT count(*) FROM all_objects</select>
</mapper>

我也有以下的Java映射器:

public interface UserMapper {User getUser( String id);List getUniqueJob();UserObject getUserObject(String objectName);String allObjectCount();List getAllObjectsTypeByGroup();
}

和Web服务,如下所示:

@WebService(name = "BusinessRulesServices",serviceName="BusinessRulesServices",targetNamespace = "http://com.blu.rules/services")
public class WebServices {private UserServices userServices;@WebMethod(operationName = "getUserName")public String getUserName(String userId){User user = userServices.getUser(userId);return user.getuName();}@WebMethod(operationName = "getUserObject")public UserObject getUserObject(String objectName){return userServices.getUserObject(objectName);}@WebMethod(operationName = "getUniqueJobs")public List getUniqueJobs(){return userServices.getUniqueJobs();}@WebMethod(exclude = true)public void setDao(UserServices userServices){this.userServices = userServices;}@WebMethod(operationName = "allObjectCount")public String allObjectCount(){return userServices.allObjectCount();}@WebMethod(operationName = "getAllObjectsTypeCntByGroup")public List getAllObjectsTypeCntByGroup(){return userServices.getAllObjectCntbyGroup();}}

如果我将在soupUI中调用Web方法'getAllObjectsTypeCntByGroup',则第一次它将获得非常高的响应时间,大约为1700 ms,因为结果不在缓存中。 从第二次开始,响应时间将为〜4到〜5 ms。

首次调用网络方法如下所示:


第二次或更晚调用Web方法的响应时间


在apache中,ignite缓存条目将如下所示:

  • 快取金钥

    CacheKey [idHash=46158416, hash=1558187086, checksum=2921583030, count=5, multiplier=37, hashcode=1558187086, updateList=[com.blu.ignite.mapper.UserMapper.getAllObjectsTypeByGroup, 0, 2147483647, SELECT t.object_type, count(*) as cnt FROM all_objects t group by t.OBJECT_TYPE, SqlSessionFactoryBean]]
  • 值类别java.util.ArrayList
  • 缓存值
    [UobjectGroupBy [idHash=2103707742, hash=1378996400, cnt=1, object_type=EDITION], UobjectGroupBy [idHash=333378159, hash=872886462, cnt=444, object_type=INDEX PARTITION], UobjectGroupBy [idHash=756814918, hash=1462794064, cnt=32, object_type=TABLE SUBPARTITION], UobjectGroupBy [idHash=931078572, hash=953621437, cnt=2, object_type=CONSUMER GROUP], UobjectGroupBy [idHash=1778706917, hash=1681913927, cnt=256, object_type=SEQUENCE], UobjectGroupBy [idHash=246231872, hash=1764800190, cnt=519, object_type=TABLE PARTITION], UobjectGroupBy [idHash=1138665719, hash=1030673983, cnt=4, object_type=SCHEDULE], UobjectGroupBy [idHash=232948577, hash=1038362844, cnt=1, object_type=RULE], UobjectGroupBy [idHash=1080301817, hash=646054631, cnt=310, object_type=JAVA DATA], UobjectGroupBy [idHash=657724550, hash=1248576975, cnt=201, object_type=PROCEDURE], UobjectGroupBy [idHash=295410055, hash=33504659, cnt=54, object_type=OPERATOR], UobjectGroupBy [idHash=150727006, hash=499210168, cnt=2, object_type=DESTINATION], UobjectGroupBy [idHash=1865360077, hash=727903197, cnt=9, object_type=WINDOW], UobjectGroupBy [idHash=582342926, hash=1060308675, cnt=4, object_type=SCHEDULER GROUP], UobjectGroupBy [idHash=1968399647, hash=1205380883, cnt=1306, object_type=PACKAGE], UobjectGroupBy [idHash=1495061270, hash=1345537223, cnt=1245, object_type=PACKAGE BODY], UobjectGroupBy [idHash=1328790450, hash=1823695135, cnt=228, object_type=LIBRARY], UobjectGroupBy [idHash=1128429299, hash=1267824468, cnt=10, object_type=PROGRAM], UobjectGroupBy [idHash=760711193, hash=1240703242, cnt=17, object_type=RULE SET], UobjectGroupBy [idHash=317487814, hash=61657487, cnt=10, object_type=CONTEXT], UobjectGroupBy [idHash=1079028994, hash=1960895356, cnt=229, object_type=TYPE BODY], UobjectGroupBy [idHash=276147733, hash=873140579, cnt=44, object_type=XML SCHEMA], UobjectGroupBy [idHash=24378178, hash=1621363993, cnt=1014, object_type=JAVA RESOURCE], UobjectGroupBy [idHash=1891142624, hash=90282027, cnt=10, object_type=DIRECTORY], UobjectGroupBy [idHash=902107208, hash=1995006200, cnt=593, object_type=TRIGGER], UobjectGroupBy [idHash=142411235, hash=444983119, cnt=14, object_type=JOB CLASS], UobjectGroupBy [idHash=373966405, hash=1518992835, cnt=3494, object_type=INDEX], UobjectGroupBy [idHash=580466919, hash=1394644601, cnt=2422, object_type=TABLE], UobjectGroupBy [idHash=1061370796, hash=1861472837, cnt=37082, object_type=SYNONYM], UobjectGroupBy [idHash=1609659322, hash=1543110475, cnt=6487, object_type=VIEW], UobjectGroupBy [idHash=458063471, hash=1317758482, cnt=346, object_type=FUNCTION], UobjectGroupBy [idHash=1886921697, hash=424653540, cnt=7, object_type=INDEXTYPE], UobjectGroupBy [idHash=1455482905, hash=1776171634, cnt=30816, object_type=JAVA CLASS], UobjectGroupBy [idHash=49819096, hash=2110362533, cnt=2, object_type=JAVA SOURCE], UobjectGroupBy [idHash=1916179950, hash=1760023032, cnt=10, object_type=CLUSTER], UobjectGroupBy [idHash=1138808674, hash=215713426, cnt=2536, object_type=TYPE], UobjectGroupBy [idHash=305229607, hash=340664529, cnt=23, object_type=JOB], UobjectGroupBy [idHash=1365509716, hash=623631686, cnt=12, object_type=EVALUATION CONTEXT]]

结论

使用L2缓存可以减少昂贵的数据库操作,在MyBatis中正确使用L2缓存可以将应用程序性能提高10到20倍。 内存数据网格中的Apache Ignite非常适合用于此目的,当然您也可以使用Hazelcash,EhCache或任何其他缓存工具。

翻译自: https://www.javacodegeeks.com/2016/03/pitfalls-mybatis-caches-apache-ignite.html

MyBatis缓存与Apache Ignite的陷阱相关推荐

  1. mybatis缓存二级缓存_MyBatis缓存与Apache Ignite的陷阱

    mybatis缓存二级缓存 一周前,MyBatis和Apache ignite 宣布支持apache ignite作为MyBatis缓存(L2缓存). 从技术上讲,MyBatis支持两个级别的缓存: ...

  2. apache ignite_从In Memory Data Grid,Apache Ignite快速入门

    apache ignite IMDG或内存数据网格不是内存中关系数据库,NOSQL数据库或关系数据库. 它是另一种软件数据存储库. 数据模型分布在单个位置或多个位置的许多服务器上. 这种分布称为数据结 ...

  3. Apache Ignite——集合分布式缓存、计算、存储的分布式框架

    Apache Ignite内存数据组织平台是一个高性能.集成化.混合式的企业级分布式架构解决方案,核心价值在于可以帮助我们实现分布式架构透明化,开发人员根本不知道分布式技术的存在,可以使分布式缓存.计 ...

  4. apache ignite_使用Spring Data的Apache Ignite

    apache ignite Spring Data提供了一种统一而简便的方法来访问不同类型的持久性存储,关系数据库系统和NoSQL数据存储. 它位于JPA之上,添加了另一层抽象并定义了基于标准的设计以 ...

  5. Apache Ignite,Hazelcast,Cassandra和Tarantool之间的主要区别

    Apache Ignite在世界范围内得到广泛使用,并且一直在增长. 诸如Barclays,Misys,Sberbank(欧洲第三大银行),ING,JacTravel之类的公司都使用Ignite来增强 ...

  6. 使用Spring Data的Apache Ignite

    Spring Data提供了一种统一而简单的方法来访问不同类型的持久性存储,关系数据库系统和NoSQL数据存储. 它位于JPA之上,添加了另一层抽象并定义了基于标准的设计以在Spring上下文中支持持 ...

  7. Apache Ignite 基本概念

    简单说Apache Ignite是为开发人员提供了实时处理大数据和内存计算的方便易用的解决方案: 一个以内存为中心的数据平台 可持久化.强一致和高可用 强大的SQL.键-值存储及相关的API Bigd ...

  8. 用Apache Ignite实现可扩展的数据网格

    在本文中,我们将先介绍数据网格(Data Grid)的基本概念.属性.以及能够提供的服务,然后讨论如何设计可扩展的数据网格,以满足实际场景的业务需求. 什么是数据网格? 数据网格是一组能够提供共享数据 ...

  9. MyBatis复习笔记6:MyBatis缓存机制

    MyBatis缓存机制 MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制.缓存可以极大的提升查询效率. MyBatis系统中默认定义了两级缓存. 一级缓存和二级缓存. 默认情 ...

最新文章

  1. BZOJ4152 AMPPZ2014 The Captain(最短路)
  2. 【⛸️拒绝手滑,我们都是稳准狠⛸️】C++のmemset函数的小探究
  3. c语言圈子,C语言经典编程
  4. java修改title_js修改title
  5. c语言错误重定义,C语言的重定义错误求解
  6. 如何对聚类结果进行分析_如何更合理地给聚类结果贴标签——由一个挖掘学生用户的项目说开去...
  7. php+获取jq表单数据类型,jquery怎么获取表单标签值
  8. python读取配置文件存在某配置_Python读取ini配置文件的方式
  9. 用jsp开发web应用并不是一个高效率的选择
  10. python人门指南小说-致Python初学者 Anaconda入门使用指南完整版
  11. android定位和地图开发实例
  12. 倍福Twincat下载,下载老版本的twincat软件(新)
  13. Vue地图导航调用百度地图
  14. 【Uplift】评估方法篇
  15. 小智-微直播 使用教程
  16. yoloV4mosaic数据增强,同步Pascal VOC格式的XML标注信息
  17. 匿名信一封来信一封云来信表白祝福道歉短信H5公众号系统搭建(搭建赠送人工传话系统+主机管理面板)
  18. 什么是联想能力?如何提高联想能力?
  19. DTW 笔记: Dynamic Time Warping 动态时间规整 (DTW的python实现) 【DDTW,WDTW】
  20. 线性回归python实现详解(附公式推导)

热门文章

  1. 高级 | Java中获取类名的3种方法
  2. Java:关于main方法的10道面试题
  3. 一篇文章搞定面试中的二叉树
  4. 如何加快github的clone速度
  5. 直接输出数组的名字不一定是地址值
  6. Mybatis传入参数类型为ListIntergert作为条件进行查询
  7. Mysql8.0可以使用解压版 这个比较快 好像现在都是解压版了
  8. URLConnection-URL连接
  9. 如何把模型表导入数据库
  10. 在Spring中使用多个动态缓存