mybatis整合ehcache

ehcache是一个分布式缓存框架。

1.分布缓存
我们系统为了提高系统并发,性能、一般对系统进行分布式部署(集群部署方式)

如图

不使用分布缓存,缓存的数据在各各服务单独存储,不方便系统开发。所以要使用分布式缓存对缓存数据进行集中管理。

mybatis无法实现分布式缓存,需要和其它分布式缓存框架进行整合。

2.整合方法(掌握)

mybatis提供了一个cache接口,如果要实现自己的缓存逻辑,实现cache接口开发即可。

mybatis和ehcache整合,mybatis和ehcache整合包中提供了一个cache接口的实现类。

mybatis默认实现cache类(接口)是:
此接口在MyBatis-3.2.7.jar下的org.apache.ibatis.cache包下的Cache.class

[java] view plaincopy
  1. package org.apache.ibatis.cache;
  2. import java.util.concurrent.locks.ReadWriteLock;
  3. public interface Cache {
  4. //缓存在唯一标示
  5. String getId();
  6. //存入到缓存中
  7. void putObject(Object key, Object value);
  8. //根据key取出缓存
  9. Object getObject(Object key);
  10. //移除key
  11. Object removeObject(Object key);
  12. void clear();
  13. int getSize();
  14. ReadWriteLock getReadWriteLock();
  15. }

MyBatis默认实现支持的cache类是:

[java] view plaincopy
  1. package org.apache.ibatis.cache.impl;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.concurrent.locks.ReadWriteLock;
  5. import org.apache.ibatis.cache.Cache;
  6. import org.apache.ibatis.cache.CacheException;
  7. public class PerpetualCache implements Cache {
  8. private String id;
  9. private Map<Object, Object> cache = new HashMap<Object, Object>();
  10. public PerpetualCache(String id)
  11. {
  12. this.id = id;
  13. }
  14. public String getId() {
  15. return id;
  16. }
  17. public int getSize() {
  18. return cache.size();
  19. }
  20. public void putObject(Object key, Object value) {
  21. cache.put(key, value);
  22. }
  23. public Object getObject(Object key) {
  24. return cache.get(key);
  25. }
  26. public Object removeObject(Object key) {
  27. return cache.remove(key);
  28. }
  29. public void clear() {
  30. cache.clear();
  31. }
  32. public ReadWriteLock getReadWriteLock() {
  33. return null;
  34. }
  35. public boolean equals(Object o) {
  36. if (getId() == null)
  37. throw new CacheException("Cache instances require an ID.");
  38. if (this == o) return true;
  39. if (!(o instanceof Cache)) return false;
  40. Cache otherCache = (Cache) o;
  41. return getId().equals(otherCache.getId());
  42. }
  43. public int hashCode() {
  44. if (getId() == null)
  45. throw new CacheException("Cache instances require an ID.");
  46. return getId().hashCode();
  47. }
  48. }

可以根据它来写新的实现类

3.加入ehcache包
ehcache-core-2.6.5.jar和mybatis-ehcache-1.0.2.jar
一个是ehcache自己的,一个是和mybatis的整合包

4.整合ehcache
配置mapper中cache中的type为ehcache对cache接口的实现类型。
我们在mybatis-ehcache-1.0.2.jar下找到org.mybatis.caches.ehcache包下有EhcacheCache.class类,这个就是ehcache整合mybatis的Cache接口的实现
UserMapper.xml:

[html] view plaincopy
  1. <mapper namespace="cn.edu.hpu.mybatis.mapper.UserMapper">
  2. <!-- 开启本Mapper的namespace下的二级缓存
  3. type:执行cache接口实现类的类型,mybatis默认使用PerpatualCache,
  4. 要和ehcache整合,需要配置type为ehcache实现cache接口的类型-->
  5. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
  6. ......
  7. </mapper>

5.加入ehcache的配置文件

在classpath下配置ehcache.xml

[html] view plaincopy
  1. <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
  3. <diskStore path="F:\develop\ehcache" />
  4. <defaultCache
  5. maxElementsInMemory="1000"
  6. maxElementsOnDisk="10000000"
  7. eternal="false"
  8. overflowToDisk="false"
  9. timeToIdleSeconds="120"
  10. timeToLiveSeconds="120"
  11. diskExpiryThreadIntervalSeconds="120"
  12. memoryStoreEvictionPolicy="LRU">
  13. </defaultCache>
  14. </ehcache>

测试:

[java] view plaincopy
  1. //测试二级缓存
  2. @Test
  3. public void testCache2() throws Exception{
  4. SqlSession sqlSession1 = sqlSessionFactory.openSession();
  5. SqlSession sqlSession2 = sqlSessionFactory.openSession();
  6. SqlSession sqlSession3 = sqlSessionFactory.openSession();
  7. UserMapper userMapper1 = sqlSession1.getMapper(UserMapper.class);//创建代理对象
  8. //下边查询使用一个SqlSession
  9. //第一次发起请求,查询id为1的用户
  10. User user1 = userMapper1.findUserById(1);
  11. System.out.println(user1.getUsername());
  12. //不关闭SqlSession无法写进二级缓存区域中
  13. sqlSession1.close();
  14. UserMapper userMapper2 = sqlSession2.getMapper(UserMapper.class);//创建代理对象
  15. //第二次发起请求,查询id为1的用户
  16. User user2 = userMapper2.findUserById(1);
  17. System.out.println(user2.getUsername());
  18. sqlSession2.close();
  19. }

结果和输出日志:

[plain] view plaincopy
  1. DEBUG [main] - Cache Hit Ratio [cn.edu.hpu.mybatis.mapper.UserMapper]: 0.0
  2. DEBUG [main] - Opening JDBC Connection
  3. DEBUG [main] - Created connection 4554017.
  4. DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@457d21]
  5. DEBUG [main] - ==>  Preparing: SELECT * FROM USER WHERE id=?
  6. DEBUG [main] - ==> Parameters: 1(Integer)
  7. DEBUG [main] - <==      Total: 1
  8. 张明明
  9. DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.Connection@457d21]
  10. DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.Connection@457d21]
  11. DEBUG [main] - Returned connection 4554017 to pool.
  12. DEBUG [main] - Cache Hit Ratio [cn.edu.hpu.mybatis.mapper.UserMapper]: 0.5
  13. 张明明

整合ehcache成功!
6.二级应用场景
对于访问多的查询请求且用户对查询结果实时性要求不高,此时可采用mybatis二级缓存技术降低数据库访问量,提高访问速度,业务场景比如:耗时较高的统计分析sql、电话账单查询sql等。
实现方法如下:通过设置刷新间隔时间,由mybatis每隔一段时间自动清空缓存,根据数据变化频率设置缓存刷新间隔flushInterval,比如设置为30分钟、60分钟、24小时等,根据需求而定。

7.二级缓存局限性
mybatis二级缓存对细粒度的数据级别的缓存实现不好,比如如下需求:对商品信息进行缓存,由于商品信息查询访问量大,但是要求用户每次都能查询最新的商品信息,此时如果使用mybatis的二级缓存就无法实现当一个商品变化时只刷新该商品的缓存信息而不刷新其它商品的信息,因为mybaits的二级缓存区域以mapper为单位划分,当一个商品信息变化会将所有商品信息的缓存数据全部清空。解决此类问题需要在业务层根据需求对数据有针对性缓存。

【MyBatis框架】查询缓存-二级缓存-整合ehcache相关推荐

  1. mybatis的缓存机制(一级缓存二级缓存和刷新缓存)和mybatis整合ehcache

    1      查询缓存 1.1  什么是查询缓存 mybatis提供查询缓存,用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存. 一级缓存是SqlSession级别的缓存.在 ...

  2. Mybatis的一、二级缓存的原理与使用、禁止指定方法的二级缓存与刷新缓存、Mybatis整合Ehcache、二级缓存的使用场景与局限性-day03

    目录 第一节 Mybatis的缓存 1.1 Mybatis的缓存理解 1.2 一级缓存 原理 使用与测试 1.3 二级缓存 原理 使用与测试 禁用指定方法的二级缓存 刷新缓存 总结 1.4 整合ehc ...

  3. MyBatis 一级缓存二级缓存详解

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) MyBatis 缓存详解 cache 缓存 缓存是一般的ORM 框架都会提供的功能,目的就是提升查询的效率和减少数据库的压力.跟Hibernat ...

  4. 深入浅出 MyBatis 的一级、二级缓存机制

    一.MyBatis 缓存 缓存就是内存中的数据,常常来自对数据库查询结果的保存.使用缓存,我们可以避免频繁与数据库进行交互,从而提高响应速度. MyBatis 也提供了对缓存的支持,分为一级缓存和二级 ...

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

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

  6. 一级缓存--二级缓存详解

    一级缓存 由于一级缓存的作用域是SqlSession内部,但是SqlSession的生命周期非常短暂,所以一级缓存对于查询效率的提升很有限.而要提升效率,需要使用二级缓存. 二级缓存 1.开启全局开关 ...

  7. mybatis教程--查询缓存(一级缓存二级缓存和整合ehcache)

    查询缓存 1 缓存的意义 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题. 2 mybat ...

  8. 【MyBatis框架】查询缓存-二级缓存原理

    二级缓存原理 1.原理 首先看图 首先开启mybatis的二级缓存. sqlSession1去查询用户id为1的用户信息,查询到用户信息会将查询数据存储到二级缓存中. 如果SqlSession3去执行 ...

  9. redis springmvc mysql_SpringMVC + MyBatis + Mysql + Redis(作为二级缓存) 配置

    项目环境: 在SpringMVC + MyBatis + Mysql.Redis部署在Linux虚拟机. 1.整体思路 参考Ehcache实现MyBatis二级缓存代码(Maven引用对应jar查阅) ...

最新文章

  1. 怎样实现强人工智能?
  2. (转)Ubuntu10.04各文件夹的作用
  3. linux进程调度周期,Linux进程组调度机制学习
  4. threejs- z-fighting 问题
  5. 贝叶斯网络(Bayesian network))简介(PRML第8.1节总结)概率图模型(Graphical models)...
  6. 基于TCP的网络游戏黑白棋系列(二):数据传输
  7. 拓端tecdat|R语言用AR,MA,ARIMA 模型进行时间序列预测
  8. MplusAutomation包的使用 二
  9. 微软代码审查工具_微软代码审查的工作方式
  10. shiro原理及其运行流程介绍
  11. 证书信任管理器(用于https请求) X509TrustManager
  12. lcs问题java_动态规划法(十)最长公共子序列(LCS)问题
  13. 什么样的项目适合UI自动化测试
  14. 时间晶体,一种曾被认为是无法存在的物质,被创造出来了吗?
  15. 心形尺寸比例图解_标识牌尺寸大小及空间比例关系示意图与人体工程学
  16. 用mybatis的generator自动生成代码--坑我都走了一遍,后面的同学别踩了
  17. 进制转换(任意进制转换)
  18. android小程序-电子钢琴-滑动连续响应
  19. 【CSS 教程系列第 3 篇】CSS 如何添加注释
  20. 视频编码h264怎么看_怎么用短视频带货最有效?看这一篇就够了

热门文章

  1. 支持所有库的python手机编程-入坑 Python 后强烈推荐的一套工具库
  2. 25马5跑道,求最快的五匹马的需要比赛的次数
  3. Javascript函数调用的四种方法
  4. 如何导出已有的谷歌插件,又如何把导出的插件安装到360浏览器中,又如何对插件小修小改?...
  5. myeclipse 项目改名404
  6. C#中怎么判断一个数组中是否存在某个数组值
  7. 如何管理好IDC机房?(一)
  8. EMC业务连续性和容灾服务
  9. [前端漫谈_4] 从 薛定谔的猫 聊到 Event loop
  10. 迷你版Spring MVC 实现