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,一经查实,立即删除!

相关文章

pptp mysql 认证_CentOS6.5搭建PPTP+Freeradius整合***管理系统

1、搭建PPTP服务php一、安装yum源mysql[rootNode ~]# cd /etc/yum.repos.d[rootNode ~]# wget http://mirrors.163.com/.help/CentOS6-Base-163.repo[rootNode ~]# yum -y install epel-relaese或web[rootNode ~]# rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/epel/6/x86_6…

OAuth2.0详解

来源博客&#xff1a;http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html OAuth是一个关于授权&#xff08;authorization&#xff09;的开放网络标准&#xff0c;在全世界得到广泛应用&#xff0c;目前的版本是2.0版。本文对OAuth 2.0的设计思路和运行流程&#xff0c;做…

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

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

java web mvc_构建Java Web应用程序时遵循MVC的三个步骤

java web mvc第1步 做 始终通过servlet / action bean处理URL&#xff08;POST表单&#xff0c;单击链接等&#xff09;&#xff0c;而不是通过JSP处理 为什么 ActionBeans&#xff08;无论某些框架调用那些类&#xff09;&#xff0c;而servlet很少是控制器 用于处理用户输入。…

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

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

JQuery 对表单进行初始化操作

提供一种如果前台页面标签比较多&#xff0c;如果挨个初始化的话可能会比较繁琐&#xff0c;这时候我们可以将后台传递的数据组装为json串&#xff0c;前台用jquery将代码初始化到表单中。 function loadData(jsonStr) {// alert(jsonStr.toString())var obj eval("(&qu…

Winform控件扩展

1.TextBox 增加水印 新增一个用户控件&#xff0c;将继承UserControl改为TextBox public partial class TextBoxEP : TextBox{public TextBoxEP(){InitializeComponent();}private const uint WT_Mark 0x1501;[DllImport("user32.dll", CharSet CharSet.Auto, SetL…

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服务 &…

mysql把一个字段加到另一张表中_mysql如何能把一个表中的某一字段下的数据加入另一个表中相同字段下,条件是两表中的某字段相同?...

1、创建表create table a (name varchar(20) not null,sex varchar(10));create table b (name varchar(20) not null,sex varchar(10));2、插入值insert into a values(john,male);insert into b values(john,male);insert into a values(kate,female);insert into b values(k…

jboss数据源配置

http://blog.csdn.net/clinique/article/details/7482670 最近项目相关的JBOSS配置开始&#xff0c;留下点什么 项目使用的是local-tx-datasource, 网上找了很多资料&#xff0c;都没有明确说明local-tx-datasource和xa-datasource的区别&#xff0c;而且中文的资料太少&#x…

创建虚拟环境和新建工程目录

一、创建虚拟环境 virtualenv -p python版本的路径.exe 虚拟环境名称 #新建虚拟环境 eg&#xff1a;virtualenv -p C:\Users\fanlala\AppData\Local\Programs\Python\Python35-32\python.exe article_spider #使用python3.5新建名为article_spider的虚拟环境。 新建完成虚…

python装饰器编程_Python编程中装饰器的使用示例解析

装饰函数和方法我们先定义两个简单的数学函数&#xff0c;一个用来计算平方和&#xff0c;一个用来计算平方差&#xff1a; # get square sumdef square_sum(a, b):return a**2 b**2# get square diffdef square_diff(a, b):return a**2 - b**2print(square_sum(3, 4))print(s…

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

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

最短路和次短路问题,dijkstra算法

1 /* 2 *题目大意&#xff1a; 3 *在一个有向图中,求从s到t两个点之间的最短路和比最短路长1的次短路的条数之和; 4 * 5 *算法思想&#xff1a; 6 *用A*求第K短路,目测会超时,直接在dijkstra算法上求次短路; 7 *将dist数组开成二维的,即dist[v][2],第二维分别用于记录最短…

Java EE 8 MVC:使用bean参数

在上一篇文章中&#xff0c;我们看到了如何在MVC Controller中访问query &#xff0c; path和form参数 。 这篇文章展示了如何使用BeanParam批注将多个参数映射到一个对象。 让我们重用关于表单参数的文章中的简单HTML表单&#xff1a; <form action"submit" me…

用python验证猜想之类的例子_python练手好例子:验证哥德巴赫猜想

哥德巴赫猜想是一个谜&#xff0c;但十分适合用来作为编程练习涉及的几个问题&#xff1a;1、如何验证一个数是素数 def prime(n)一个整数n不能被2 到 n \sqrt{n}n​整除&#xff0c;则为素数2、产生N以内的素数列表本文中N取100&#xff0c;可以取更大3、对于大于6的偶数&…

oracle安装及卸载总结

>>>>> oracle安装&#xff08;卸载&#xff09;教程&#xff08;来自网络&#xff09;&#xff1a;链接: http://pan.baidu.com/s/1eSzSwZC 密码: g3qn oracle_win_64安装包&#xff08;官网下的&#xff09;&#xff1a;链接: http://pan.baidu.com/s/1nvBPzkt…

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

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

mysql 中 and和or 一起使用和之间的优先级

SELECT address,job_title,education,SUM(recruiting) FROM commerce_jobs WHERE education 大专 and ( job_title LIKE %主管% OR job_title LIKE %组长% OR job_title LIKE %主任% OR job_title LIKE %项目经理% ) 标红部分的() 括号。and 比 or具有更高的优先级&#xff0c…