Mybatis的二级缓存配置

来源:互联网 发布:淘宝客服聊天记录查看 编辑:程序博客网 时间:2024/05/21 14:05

一个项目中肯定会存在很多共用的查询数据,对于这一部分的数据,没必要
每一个用户访问时都去查询数据库,因此配置二级缓存将是非常必要的。  
Mybatis的二级缓存配置相当容易,要开启二级缓存,只需要在你的Mapper
映射文件中添加一行:  
<cache /> 
它将采用默认的行为进行缓存:

  •  映射文件中所有的select语句将被缓存
  •  映射文件中所有的insert、update和delete语句将刷新缓存 
  •  缓存将使用LRU(Least Recently Used)最近最少使用策略算法来回收
  •  刷新间隔(no Flush Interval,没有刷新间隔),缓存不会以任何时间顺序来刷新
  •  缓存会存储列表集合和对象(无论查询方法返回什么)的1024个引用 
  •  缓存会被视为read/write(可读/可写)的缓存,意味着对象检索不是共享的,而且可以安全的被调用者修改,而不干扰其他调用者或者线程所做的潜在修改

所有这些属性都可以通过缓存元素的属性来修改,比如: 

<cache 
 eviction="FIFO"  
 flushInterval="10800000"  size="512" 
 readOnly="true"  

/> 

这个更高级的配置创建了一个FIFO缓存,并每隔3个小时刷新缓存,储存结
果对象或列表的512个引用,而且返回的对象被认为是只读的,因此在不同线程中的调用者之间修改他们会导致冲突。


可用的收回策略有

  • 【默认】LRU——最近最少使用的:移除最长时间不被使用的对象 
  •  FIFO——先进先出的:按对象进入缓存的顺序来移除他们 
  •  SOFT——软引用:移除基于垃圾回收器状态和软引用规则的对象 
  •  WEAK——弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。

flushInterval(刷新间隔)可以被设置为任意的正整数(60*60*1000这种形式是不允许的),而且它们代表一个合理的毫秒形式的时间段。默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。 
size(引用数目)可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的可用内存资源数目。默认值是1024. 
readOnly(只读)属性可以被设置为true或false。只读的缓存会给所有调用者返回缓存对象的相同实例,因此这些对象不能被修改,这提供了很重要的性能优势。可读写的缓存会返回缓存对象的拷贝(通过发序列化)。这会慢一些,但是安全,因此默认是false。


配置完<cache/>表示该mapper映射文件中,所有的select语句都将被缓存,所有的insert、update和delete语句都将刷新缓存。但是实际中,我们并是希望这样,有些select不想被缓存时,可以添加select的属性useCache=“false”;有些insert、update和delete不想让他刷新缓存时,添加属性flushCache=”false ”。


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

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

mybatis无法实现分布式缓存,需要和其它分布式缓存框架进行整合。这里我主要介绍整合EhCache。下面开始实例。


实例

1.导入MyBatis-EhCache整合包

整合包

项目结构如下: 
项目结构

2.classpath下添加EhCache配置文件(ehcache.xml)

<ehcache>    <diskStore path="F:\cache_test" />    <defaultCache eternal="false" maxElementsInMemory="1000"        timeToIdleSeconds="20" timeToLiveSeconds="20" overflowToDisk="true"        maxEntriesLocalDisk="10000000"        diskExpiryThreadIntervalSeconds="20" memoryStoreEvictionPolicy="LRU" /></ehcache>

3.MyBatis配置文件(SqlMapConfig.xml)打开二级缓存

    <settings>        <setting name="cacheEnabled" value="true"/>    </settings>

4.Mapper配置文件添加cache标签

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

5.缓存结果继承序列化接口

public class User implements Serializable

测试

测试类如下:

package cn.pwc.test;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import cn.pwc.dao.UserMapper;import cn.pwc.pojo.User;public class Test {    public static void main(String[] args) {        SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(Test.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml"));        SqlSession session = factory.openSession();        UserMapper mapper = session.getMapper(UserMapper.class);        User user = mapper.findById(1);        System.out.println(user.toString());        session.commit();        session.close();        SqlSession session2 = factory.openSession();        UserMapper mapper2 = session2.getMapper(UserMapper.class);        User user2 = mapper2.findById(1);        System.out.println(user2.toString());        session2.commit();        session2.close();    }}

测试结果如下:

DEBUG [cn%002epwc%002edao%002e%0055ser%004dapper.data]     net.sf.ehcache.store.disk.Segment     - fault removed 0 from heapDEBUG [cn%002epwc%002edao%002e%0055ser%004dapper.data]     net.sf.ehcache.store.disk.Segment     - fault added 0 on disk

 <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">


 
    <diskStore path="E:\new"/>
  <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            maxElementsOnDisk="10000000"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU">
        <persistence strategy="localTempSwap"/>
    </defaultCache>
</ehcache>


数据库配置文件

 

实体映射文件

jar包图

目录结构

0 0
原创粉丝点击