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

mybatis缓存二级缓存

一周前,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在15.46.29
第二次或更晚调用Web方法的响应时间

屏幕截图2016年2月28日在15.47.01
在apache中,ignite缓存条目将如下所示:

屏幕截图2016-02-28 at 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

mybatis缓存二级缓存

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

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

相关文章

企业是否应该实现对客户需求的快速响应_CRM系统给企业带来的创新有哪些?如何让销售爱用CRM系统?...

对于现代企业来说&#xff0c;CRM已然成为了一个成熟的项目&#xff0c;是能够给客户带来不菲的价值的。如果应用好&#xff0c;是能够取得提高客户满意度与企业经济效益的双赢成绩的。一、目前&#xff0c;CRM能够给企业带来的业务创新有哪些&#xff1f;1.统一数据CRM系统能将…

junit注释_通过此注释改善您的JUnit体验

junit注释JUnit可能是所有Java项目中90&#xff05;的一部分。 令人兴奋的是&#xff0c;我们很快将拥有支持Java 8的JUnit 5 。 我们最近在博客上发表了一项改进 。 回到JUnit 4领域&#xff0c;有一个小技巧&#xff0c;我只能建议您进行所有单元测试。 只需在此处添加这个小…

lagom的微服务框架_微服务有麻烦吗? Lagom在这里为您提供帮助。 试试吧!

lagom的微服务框架蛋糕支持。 我们很自豪地宣布&#xff0c;新的Apache许可的微服务框架Lagom可在GitHub上使用 &#xff01; 当其他框架专注于打包和实例启动时&#xff0c;Lagom重新定义了Java开发人员构建基于微服务的应用程序的方式。 服务是异步的。 服务内通信由您管理。…

python离线安装包_Python2.7如何离线安装包

1 Python版本是2.7已经在CentOS7系统自带&#xff0c;没有pip&#xff0c;没有互联网环境&#xff0c;需要先安装 backports.ssl_match_hostname-3.4.0.2.tar.gz&#xff0c;直接再CentOS7系统运行以下命令&#xff1a; 解压tar文件 tar -xvf backports.ssl_match_hostname-3.4…

【音视频安卓开发 (三)】OpenGL ES 直接绘制YUV

EGL OpenGL与窗口对应的的适配层&#xff0c;针对安卓平台的适配器。 surface 交互到窗口显示

上网登录窗不弹出_配置 Windows XP 正常上网(TLS HTTPS),连接到 NAS

Windows XP 是经典的、高效的、可靠的、性能良好的操作系统&#xff0c;然而其大部分版本都已在 2014 年停止支持。其较为流行的版本 SP2 与 SP3 由于各种原因&#xff0c;目前均不能直接正常访问安装了 SSL 证书的网站&#xff0c;或映射某些服务器提供的共享文件夹。本文将提…

oracle数据库集群日志,Oracle集群数据库中恢复归档日志

恢复归档日志&#xff1a;select * from v$log_history t where t.THREAD#恢复归档日志&#xff1a;select * from v$log_history t where t.THREAD#1order by t.FIRST_TIME desc实例1&#xff1a;恢复一个归档日志&#xff1a;run{allocate channel dev_0 type sbt_tapeparms …

jcmd 命令_jcmd:一个可以全部统治的JDK命令行工具

jcmd 命令我在过去的几篇文章中都引用了方便的JDK工具jcmd &#xff0c;但是像我以前对jps所做的那样&#xff0c;只专注于它的实用性 。 jcmd工具是随Oracle Java 7引入的&#xff0c;通过使用它来识别Java进程的ID &#xff08;与jps相似&#xff09;&#xff0c;获取堆转储 …

【流媒体FLV封装协议】

FLV封装格式介绍及解析 FLV封装格式 FLV(Flash Video)是Adobe公司推出的一种流媒体格式&#xff0c;由于其封装后的音视频文件体积小、封装简单等特点&#xff0c;非常适合于互联网上使用。目前主流的视频网站基本都支持FLV。采用FLV格式封装的文件后缀为.flv。 FLV封装格式…

python画统计图代码_Python使用统计函数绘制简单图形实例代码

前言 Matplotlib 是 Python 的绘图库。 它可与 NumPy 一起使用&#xff0c;提供了一种有效的 MatLab 开源替代方案。 它也可以和图形工具包一起使用&#xff0c;如 PyQt 和 wxPython。 用matplotlib绘制一些大家比较熟悉又经常混淆的统计图形&#xff0c;掌握这些统计图形可以对…

linux系统打开m3u8文件,M3U8 文件扩展名: 它是什么以及如何打开它?

M3U8 疑难解答打开 M3U8 文件过程中所遇到的常见问题Microsoft Windows Media Player 已删除尝试打开 M3U8 文件时&#xff0c;您收到错误 “无法打开 M3U8 文件类型”。 通常&#xff0c;%%os%% 中会出现这种情况&#xff0c;因为 Microsoft Windows Media Player 未安装在你的…

r语言 C4.5 剪枝是用什么算法_决策树,逻辑回归,PCA算法面经

目录决策树简述决策树原理&#xff1f;为什么要对决策树进行减枝&#xff1f;如何进行减枝&#xff1f;简述决策树的生成策略PCA简述主成分分析PCA工作原理&#xff0c;以及PCA的优缺点&#xff1f;PCA中有第一主成分、第二主成分&#xff0c;它们分别是什么&#xff0c;又是如…

视图中::text_新CalendarFX视图:MonthGridView!

视图中::text我和我的团队最近开始为CalendarFX创建新视图&#xff0c;其最初目标是在垂直栏中显示整年。 该视图的名称是MonthGridView。 与往常一样&#xff0c;编码时目标略有变化。 该视图现在可以显示任意数量的月份&#xff0c;并且可以在前面或后面添加额外的月份。 现在…

linux 内核 性能,Linux内核十个版本性能对比

【IT168 评论】从2008年1月底至今&#xff0c;Linux Kernel系统内核已经先后升级了十次&#xff0c;版本号也从2.6.24上升到2.6.33&#xff0c;并且下个版本2.6.34也已进入开发阶段。今天我们就看看过去两年内这十个版本在性能上有何差异。测试平台是一套工作站系统&#xff0c…

应用程序缓存_应用程序模块和实体缓存

应用程序缓存任何具有ADF业务组件基础知识的ADF开发人员都应该熟悉下图&#xff1a; 它代表运行时ADF业务组件的核心构建块。 有一个包含视图对象实例的根应用程序模块实例。 视图对象实例可能由存储在实体集合或换句话说就是实体缓存中的实体对象备份。 根应用程序模块可能还…

【开源项目】超级播放器1.0

面向对象开发的五大基本原则 单一职责 各个模块相对独立&#xff0c;优点一&#xff1a;在修改其中某个模块的时候不会对其他模块造成影响&#xff1b;优点二&#xff1a;可以对各个模块进行单独的测试&#xff1b;例如解封装模块和解码模块相互独立设计。 开闭原则 对扩展…

linux c 数据写入硬盘分区,Linux操作篇之分区/磁盘扩容(一)

在实际工作中&#xff0c;系统的运行会产生大量的日志 、临时、以及生产文件等数据。所以对磁盘空间也是有一定要求的。但在前期工作中&#xff0c;可能不会需要太大的空间&#xff0c;但是随着后期的使用&#xff0c;存储空间需求很大。这个时候进行扩容就可以了。一般情况下&…

js mztreeview 双击事件_Mac下的Node.js安装教程

前言更多详情&#xff0c;请访问我的 个人博客。什么是Node.jsNodeJS官网上的介绍&#xff1a;Node.js is a platform built on Chromes JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model …