Mybatis并不擅长缓存数据,因此引入了第三方缓存产品。

如何使用ehcache来进行缓存呢?

一、导入jar包

https://github.com/mybatis/ehcache-cache/releases

这里有两个jar包,一个是ehcache的核心jar包,另外一个是mybatis与ehcache整合的jar包。

二、添加ehcache.xml文件

将解压之后的文件夹中,有一个ehcache.xml文件,直接放在src目录下面。

三、ehcache.xml文件详解

我们将注释删去,就只剩下如下的代码

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
    <diskStore path="java.io.tmpdir"/>
    <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            maxElementsOnDisk="10000000"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU">
        <persistence strategy="localTempSwap"/>
    </defaultCache>
</ehcache>

1、<diskStore/>标签

指定一个文件目录,当内存空间不够,需要将二级缓存的数据写到硬盘上时,会写到这个目录。默认是java.io.tmpdir。

这个默认的文件临时目录在哪呢?我们可以通过java代码来获取。

     @Test
	public void testEhcache(){
		String path=System.getProperty("java.io.tmpdir");
		System.out.println(path);
	}

看控制台输出:

2、<defaultCache/>标签

<defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            maxElementsOnDisk="10000000"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU">
        <persistence strategy="localTempSwap"/>
    </defaultCache>
  • maxElementInMemory:指定这个缓冲区可以存放缓存对象的最多个数
  • eternal:设置缓存对象是否会过期。默认为true,标示对象永远不会过期,此时下面两个设置默认为false
  • timeToIdleSeconds:设置允许对象处于空闲状态的最长时间,以秒为单位。
  • timeToLiveSeconds:设置对象在缓存中存活的最长时间,当对象超过这个时间之后,就会过期,ehCache就会把它从缓存中清除出去。设置为0的时候,表示可以无限期的存在于缓存中。
  • maxElementsOnDisk:指定硬盘缓冲区可以存放缓存对象的最多个数。
  • diskExpiryThreadIntervalSeconds:指定硬盘中缓冲对象的失效时间间隔
  • memoryStoreEvictionPolicy:如果内存缓冲区超过限制,那么将才去的替换算法。有三种FIFO、LFU、LRU。

四、使用ehcache缓存机制

1、在mapper映射文件声明缓存

在这里也可以对此mapper进行设置

这是因为一个项目当中会有很多个mapper文件,不同的mapper文件有不同的namespace,那么我们就可以在这个cache来设置不同的个性换设置

2、测试类

//根据id号选出学生
	@Test
	public void testselectStudentById() {
		//第一次查询
		sqlSession = MybatisUtil.getSqlSession();
		dao = sqlSession.getMapper(IStudentDao.class);
		Student student = dao.selectStudentById(24);	
		System.out.println(student);
		
		//关闭SqlSession
		sqlSession.close();
		
		//增加一个删除操作
		sqlSession = MybatisUtil.getSqlSession();
		dao = sqlSession.getMapper(IStudentDao.class);
		dao.deleteStuById(37);
	
		//第二次查询
		sqlSession = MybatisUtil.getSqlSession();
		dao = sqlSession.getMapper(IStudentDao.class);
		Student student2 = dao.selectStudentById(24);	
		System.out.println(student2);
		
	}

查看结果:

从结果我们可以看到,增删改操作对缓存没有影响,在两次查询当中只执行了一次select语句

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐