MyBatis缓存与Apache Ignite的陷阱

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

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

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

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

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

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

屏幕截图2016-02-28 at 13.46.19
哪里:

  • 快取金钥
    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。

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

屏幕截图2016-02-28 at 15.46.29
第二次或更晚调用Web方法的响应时间

屏幕截图2016-02-28 at 15.47.01
在apache中,ignite缓存条目将如下所示:

屏幕截图2016-02-28在15.52.24

屏幕截图2016-02-28 at 15.52.241

  • 快取金钥
    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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355026.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python创建方法draw_Python做图像处理(五)---ImageDraw综合应用实例:自制验证码...

前面几讲讲解了pillow库中两个最重要的模块&#xff0c;Image模块与ImageDraw模块&#xff0c;本讲小编将这两个模块综合应用起来&#xff0c;来制作一个随机自动生成验证码的程序。1.生成验证码程序的算法设计原理验证码通常用于网络&#xff0c;是网站为了防止恶意注册和网络…

unknown error mysql_mysql执行sql文件报错Error: Unknown storage engine‘InnoDB’的解决方法...

发现问题最近在工作中遇到一个问题&#xff0c;在运行了一个innoDB类型的sql文件&#xff0c;报了Error: Unknown storage engine InnoDB错误&#xff0c;网上查了很多方法&#xff0c;但是都没办法真正解决我的问题&#xff0c;后来解决了&#xff0c;在这里总结一下过程&…

oracle 中大于等于_针对oracle安装参数调整方法

solaris针对oracle安装的shmmax参数调整方法安装数据库不能拘泥于联机文档&#xff0c;最近看到好几个跑oracle的sun主机上&#xff0c;都把和数据库内存使用相关的操作系统内核参数shmmax设置成4G&#xff0c;因为联机文档中“solaris系统上安装oracle”是这样写的。具体实施时…

带有JAX-WS和Spring的Web服务应用程序

1.简介 这是一个漫长的等待&#xff0c;但是我终于发布了一个关于使用Spring创建第一个基于SOAP的Web服务应用程序的教程。 JAX-WS &#xff08;用于XML Web服务的Java API&#xff09;是用于以XML格式创建Web服务的一组API&#xff0c;我们最常将其称为基于SOAP的Web服务 &…

mvvm 自动绑定_ZK的实际应用:MVVM –表单绑定

mvvm 自动绑定这是我们从头开始构建ZK应用程序的第二集。 上一篇文章介绍了使用MVVM将数据加载和呈现到表中。 在本文中&#xff0c;我们将向您介绍ZK MVVM的表单绑定。 目的 我们将构建一个“添加”功能&#xff0c;使我们能够将新条目保存到清单中。 单击“添加”时出现表格…

mysql全表重命名备份_MySQL数据库重命名的快速且安全方法(3种)

MySQL数据库重命名的方法Innodb引擎的表如何改数据库名&#xff0c;MyISAM引擎又该如何操作。如果表是MyISAM引擎可以直接去到数据库目录mv重命名文件夹就可以。 Innodb完全不行&#xff0c;会提示相关表不存在。第一种方法&#xff1a;rename database 弃用了RENAME database …

mysql有nvarchar类型_mysql如何处理varchar与nvarchar类型中的特殊字符

如果你每次建数据表的时候固执的使用varchar&#xff0c;那么你可能会遇到以下的问题&#xff1a; 现在saleUserName的字段类型为varchar(50) update TableNameset saleUserName小覃祝你快乐 where ID87 select * from TableName where ID87 whySaleUserName字段里的文字怎么如…

Java 8:再见手册SQL,您好!

大多数用Java编写的应用程序都需要某种形式的数据存储。 在小型应用程序中&#xff0c;这通常是通过使用普通SQL查询的原始JDBC连接来实现的。 另一方面&#xff0c;较大的系统通常使用对象关系映射&#xff08;ORM&#xff09;框架来处理数据库通信。 这两种方法都有优点和缺点…

this指针 java_彻底理解Java中this指针

每次看到Java中的this指针&#xff0c;总摸不着头绪。在网上看了很多人的讲解&#xff0c;还是不知道this指针到底是什么东西&#xff0c;今天的的这篇日志可以让你看清this到底是谁。(内容摘自&#xff1a;http://www.mathcs.emory.edu/~cheung/Courses/170.2010/Syllabus/03/…

Spring开发人员知道的一件事

在最近关于&#xff08;核心&#xff09;Spring Framework的培训课程中&#xff0c;有人问我&#xff1a;“&#xff08;Java&#xff09;Spring开发人员是否应该知道一件事&#xff0c;那应该是什么&#xff1f;” 这个问题使我措手不及。 是的&#xff0c;&#xff08;核心&a…

JavaWeb(十七)——JSP中的九个内置对象

一、JSP运行原理 每个JSP 页面在第一次被访问时&#xff0c;WEB容器都会把请求交给JSP引擎&#xff08;即一个Java程序&#xff09;去处理。JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet) &#xff0c;然后按照servlet的调用方式进行调用。  由于JSP第一次访问…

在Eclipse上创建JSF / CDI Maven项目

当我在研究JSF和CDI示例时&#xff0c;我认为提及创建JSF和CDI Maven项目所需的步骤会很有用。 您可以找到以下步骤。 工具类 默认情况下&#xff0c;M2E插件随附的Eclipse Luna。 因此&#xff0c;无需自己安装插件。 WildFlye8.x。 从主菜单中选择文件->新建->其他。…

luoguP3690 【模板】Link Cut Tree (动态树)[LCT]

题目背景 动态树 题目描述 给定&#xff2e;个点以及每个点的权值&#xff0c;要你处理接下来的&#xff2d;个操作。操作有&#xff14;种。操作从&#xff10;到&#xff13;编号。点从&#xff11;到&#xff2e;编号。 &#xff10;&#xff1a;后接两个整数&#xff08;&a…

java api操作hbase_通过JavaAPI使用HBase

1.准备工作(1) 启动zookeeper服务&#xff0c;我的是在本地启动zookeeper/usr/local/zookeeper/bin$ sudo zkServer.sh start(2) 启动HBase和HBase shell启动HBase:/usr/local/hbase/bin下启动start-hbase.sh启动HBase shell/usr/local/hbase/bin下终端输入hbase shell(3) 工程…

duilib入门简明教程 -- 部分bug (11) (转)

原文转自&#xff1a;http://www.cnblogs.com/Alberl/p/3344886.html 一、WindowImplBase的bug在第8个教程【2013 duilib入门简明教程 -- 完整的自绘标题栏(8)】中&#xff0c;可以发现窗口最大化之后有两个问题&#xff0c;1、最大化按钮的样式还是没变&#xff0c;正确的样式…

在考生文件夹存有JAVA3_注意:下面出现的“考生文件夹”均为%USER%在考生文件夹下存有文件名为J_网考网(Netkao.com)...

【分析解答题】注意&#xff1a;下面出现的“考生文件夹”均为%USER%在考生文件夹下存有文件名为Java_2.java文件&#xff0c;本题功能是完成点定义&#xff0c;并输出点坐标。请完善Java_2.java文件&#xff0e;并进行调试&#xff0c;使程序结果如下&#xff1a;x5 y5点的坐标…

jasperreports_JasperReports JSF插件用例系列

jasperreports这是文章系列的切入点&#xff0c;在该系列文章中&#xff0c;我将尝试介绍JasperReport JSF插件的一些用例&#xff0c;该工具的创建是为了轻松地将为JasperReports设计的业务报告集成到JSF应用程序中。 该系列中描述的所有示例都可以从JasperReports JSF插件网站…

RN 47 中的 JS 线程及 RunLoop

RCBridge 初始化时声明了一个 CADisplayLink _jsDisplayLink [CADisplayLink displayLinkWithTarget:self selector:selector(_jsThreadUpdate:)];在 _jsThreadUpdate 函数中&#xff0c;处理界面更新。这个 CADisplayLink 随后被加到 JS 线程对应的 RunLoop 中。 - (void)ad…

java nginx https_docker nginx 配置ssl,实现https

docker nginx 配置ssl&#xff0c;实现https2019-09-05 16:06:35.0nginx配置https总览在nginx配置ssl实现https&#xff0c;简单来说分为三个步骤&#xff1a;1 上传ssl证书等文件将 1_www.domain.com_bundle.crt 和 2_www.domain.com.key 上传到nginx配置文件的目录旁边。这两…

JavaScript入门几个概念

JavaScript入门几个概念 刚刚入门JavaScript的时候&#xff0c;搞懂DOM、BOM以及它们的对象document和window很有必要。 DOM是为了操作文档出现的API&#xff0c;document是它的一个对象。BOM是为了操作浏览器出现的API&#xff0c;window是它的一个对象。DOM When a web page …