EhCache 是一个纯Java的进程内缓存框架,是一种被广泛使用的开源Java分布式的缓存框架,具有快速、精干等特点,是Hibernate中默认的缓存提供者。不使用分布缓存,缓存的数据就会在各个服务器上单独存储,不方便系统开发。所以要使用分布式缓存对缓存数据进行集中管理。分布式缓存示意图如下:

情景:负载均衡+服务器集群(发布相同的Web应用)

用户第一次登陆,负载均衡将请求发到计算机A处理,信息放在session中。下一次用户再次访问时,请求可能计算机B,这时用户就要重新登陆???

解决这一问题:专门一台缓存机器,使用分布式缓存框架radis、echache、memcached进行管理。

>Mybatis整合echache原理

mybatis提供二级缓存Cache接口,如下所示:

mybatis针对此接口提供了一个默认的实现类,如下所示:

虽然mybatis也实现提供了二级缓存,但是mybatis的特长是SQL操作,而不是缓存管理,比如实现分布式缓存,mybatis就不支持此功能。为了提高缓存的性能将mybatis与第三方的缓存数据库框架整合即可,如ehcache、redis、memcache等。

通过上图可以看出只要实现了mybatis的cache接口就可以实现mybatis的二级缓存数据。

>Mybatis整合echache 三部曲

1、引入缓存的依赖包

2、在classpath下添加ehcache.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"updateCheck="false"><diskStore path="F:/temp" /><defaultCache maxElementsInMemory="20000" eternal="false"timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"maxElementsOnDisk="10000000" diskPersistent="false"diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU" /><cache name="eternalCache" maxElementsInMemory="20000" eternal="true"overflowToDisk="true" diskPersistent="false" timeToLiveSeconds="0"diskExpiryThreadIntervalSeconds="120" />
</ehcache>

属性说明:

diskStore:指定数据在磁盘中的存储位置。

defaultCache:当借助CacheManager.add("demoCache")创建Cache时,EhCache便会采用<defalutCache/>指定的管理策略

以下属性是必须的:

maxElementsInMemory - 在内存中缓存的element的最大数目

maxElementsOnDisk - 在磁盘上缓存的element的最大数目,若是0表示无穷大

eternal - 设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据,timeToLiveSeconds判断

overflowToDisk - 设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上

以下属性是可选的:

timeToIdleSeconds - 当缓存在EhCache中的数据前后两次访问的时间超过timeToIdleSeconds的属性取值时,这些数据便会删除,默认值是0,也就是可闲置时间无穷大

timeToLiveSeconds - 缓存element的有效生命期,默认是0.,也就是element存活时间无穷大

diskSpoolBufferSizeMB 这个参数设置DiskStore(磁盘缓存)的缓存区大小.默认是30MB.每个Cache都应该有自己的一个缓冲区.

diskPersistent - 在VM重启的时候是否启用磁盘保存EhCache中的数据,默认是false。

diskExpiryThreadIntervalSeconds - 磁盘缓存的清理线程运行间隔,默认是120秒。每个120s,相应的线程会进行一次EhCache中数据的清理工作

memoryStoreEvictionPolicy - 当内存缓存达到最大,有新的element加入的时候, 移除缓存中element的策略。默认是LRU(最近最少使用),可选的有LFU(最不常使用)和FIFO(先进先出)

3、开启ehcache缓存

在mapper.xml中开启二级缓存是通过添加cache元素,cache元素提供了一个type属性,此属性指定一个实现了mybatis的Cache接口的实现类。对于ehcache缓存框架,它提供了一个mybatis的Cache接口的实现类,只需要指向此类即可。

<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>

同样也可根据需求调整缓存参数:

<cache type="org.mybatis.caches.ehcache.EhcacheCache" > <property name="timeToIdleSeconds" value="3600"/><property name="timeToLiveSeconds" value="3600"/><!-- 同ehcache参数maxElementsInMemory --><property name="maxEntriesLocalHeap" value="1000"/><!-- 同ehcache参数maxElementsOnDisk --><property name="maxEntriesLocalDisk" value="10000000"/><property name="memoryStoreEvictionPolicy" value="LRU"/></cache>

测试程序:

@Testpublic void queryUserMapper() throws Exception{Integer userId=1;SqlSession session1=factory.openSession();UserMapper mapper1=session1.getMapper(UserMapper.class);User user1 = mapper1.queryUserById(userId);System.out.println(user1);session1.close();SqlSession session2=factory.openSession();UserMapper mapper2=session2.getMapper(UserMapper.class);User user2 = mapper2.queryUserById(userId);System.out.println(user2);session2.close();}

Debug日志:同样实现了二级缓存功能;

DEBUG [main] - ==>  Preparing: select * from user where user_id=?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <==      Total: 1
User [userId=1, userName=zhangsan, password=123456, roleCode=plain, cname=张三, telphone=17864195335, address=山东济南, isLogin=0]
DEBUG [main] - put added 0 on heap
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@44c03695]
DEBUG [main] - Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@44c03695]
DEBUG [main] - Returned connection 1153447573 to pool.
DEBUG [main] - Cache Hit Ratio [com.langsin.mapper.UserMapper]: 0.5
User [userId=1, userName=zhangsan, password=123456, roleCode=plain, cname=张三, telphone=17864195335, address=山东济南, isLogin=0]

本地出现缓存文件:

>二级缓存应用场景j及局限性

1、应用场景

对于访问次数较多的查询请求并且用户对查询的实时性要求不高,此时可以采用mybatis二级缓存技术降低数据库的访问量,提高访问速度。比如:耗时较高的统计分析SQL,电话账单查询SQL等。

实现方法如下:通过设置刷新间隔时间,由mybatis每隔一段时间自动清空缓存,根据数据变化频率设置缓存刷新间隔flushInterval,比如设置为30分钟、60分钟等,根据需求设置。

2、局限性

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

Mybatis高级应用 整合Ehcache相关推荐

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

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

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

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

  3. mybatis整合ehcache

    ehcache是一个分布式缓存框架. 1  分布缓存 我们系统为了提高系统并发,性能.一般对系统进行分布式部署(集群部署方式) 不使用分布缓存,缓存的数据在各各服务单独存储,不方便系统 开发.所以要使 ...

  4. SpringBoot整合Mybatis(高级)

    SpringBoot整合Mybatis(高级) 文章目录 SpringBoot整合Mybatis(高级) 前言 基础环境配置 增删改查 ResultMap 复杂查询 多对一 一对多 动态SQL if ...

  5. 搭建第一个SpringBoot工程;SpringBoot整合mybatis;SpringBoot整合Redis-cluster集群;SpringBoot整合EhCache;

    写在前头,以下内容主要是为了自己复习之用,如果你有幸看到这篇文章,请不要嫌弃某些地方有所跳跃或省略. 1. 搭建第一个SpringBoot工程 1.1 创建工程 1.2 初始pom.xml文件内容 1 ...

  6. [原创]mybatis中整合ehcache缓存框架的使用

    mybatis整合ehcache缓存框架的使用 mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓 ...

  7. 【MyBatis框架】查询缓存-二级缓存-整合ehcache

    mybatis整合ehcache ehcache是一个分布式缓存框架. 1.分布缓存 我们系统为了提高系统并发,性能.一般对系统进行分布式部署(集群部署方式) 如图 不使用分布缓存,缓存的数据在各各服 ...

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

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

  9. MyBatis Review——整合ehcache

    ehcache是一个分布式缓存框架,是hibernate中二级缓存的默认实现. 一,整合的思路 mybatis提供了一个cache接口,如果要实现自己的缓存逻辑,实现cache接口开发即可: myba ...

最新文章

  1. 一天一个命令--ifconfig
  2. java %= %,JavaWeb
  3. 稀疏矩阵的压缩存储与转置
  4. 剑指offer(Java实现) 从上往下打印二叉树
  5. NumPy (6)-结构化数据类型数组
  6. 718. Maximum Length of Repeated Subarray 最长重复子数组
  7. 解决vscode格式化代码html属性换行问题; ctrl+s格式化去除分号,格式化自动单引号;解决js格式化换行问题;mac上的settings.json完整配置
  8. ssh协议是osi_你见过这份864页神仙级的TCP/IP协议吗?,太香了!
  9. IIS URLReWrite URL 重写模块 下载地址
  10. open表和closed表_什么是左外连接?左外连接在工作表查询中的应用
  11. 利用DataGrid的超级联接传值
  12. C# 打开word文件
  13. 广播地址为什么只能作为目的地址,不能作为源地址?
  14. 机械硬盘显示数据错误循环冗余检查文件如何寻回
  15. Swagger3/thinkphp6教程
  16. C#操作Oracle数据库中文乱码 US7ASCII字符集 (解决方案)
  17. 【小程序】自定义导航栏
  18. Python基础——零基础学Python
  19. C++ std::ios::tie
  20. 合泰HT32 淘晶驰TJC--T0串口屏学习笔记

热门文章

  1. java面试 数据库连接池_阿里面试官:数据库连接池有必要吗?你对它的底层实现了解过没?...
  2. 机器学习经典算法笔记——线性回归
  3. 视频编辑,4k播放,3D游戏, 阿里云图形工作站,了解一下?
  4. laravel控制器方法中,用函数作为变量进行传递时的处理方法
  5. Celery 源码解析六:Events 的实现
  6. 一个方便的图片载入框架——ImageViewEx
  7. SQL 已有数据的表创建标识列
  8. ActiveRecord 模式杂谈
  9. 电商领袖战:马云虚,东哥实
  10. IBM收购数据库安全公司 围剿Oracle之心不死