springMVC+mybatis+ehcache详细配置

一、 Mybatis+Ehcache配置

为了提高MyBatis的性能,有时候我们需要加入缓存支持,目前用的比较多的缓存莫过于ehcache缓存了,ehcache性能强大,而且位各种应用都提供了解决方案,在此我们主要是做查询缓存,提高查询的效率.

整合MyBatis和ehcache需要的jar包如下:

  • ehcache-core-2.4.4.jar
  • mybatis-ehcache-1.0.0.jar
  • slf4j-api-1.6.1.jar
  • slf4j-log4j12-1.6.2.jar

资源已上传到百度网盘点击此处下载,其中包括了一些mybatis的jar包,log4j,mysql驱动等必须的包 将上述包加入项目之后,新建一个文件名,该文件名必须为ehcache.xml,放在类路径下面,内容如下:

<?xml version="1.0" encoding="UTF-8"?>  
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xsi:noNamespaceSchemaLocation="../bin/ehcache.xsd">      
    <diskStore path="java.io.tmpdir"/>       
    <!-- 缓存位置可以是自定义的硬盘地址也可以是JVM默认使用的缓存地址-->      
    <!--<diskStore path="d:\cache"/> -->      
    <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="30" timeToLiveSeconds="30" overflowToDisk="true"/>         
    <!--           
    配置自定义缓存          
    name:Cache的唯一标识          
    maxElementsInMemory:缓存中允许创建的最大对象数          
    maxElementsOnDisk:磁盘中最大缓存对象数,若是0表示无穷大          
    eternal:Element是否永久有效,一但设置了,timeout将不起作用,对象永不过期。         
    timeToIdleSeconds:缓存数据的钝化时间,也就是在一个元素消亡之前,                      
            两次访问时间的最大时间间隔值,这只能在元素不是永久驻留时有效,                      
            如果该值是 0 就意味着元素可以停顿无穷长的时间。          
    timeToLiveSeconds:缓存数据的生存时间,也就是一个元素从构建到消亡的最大时间间隔值,                               这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间。          
    overflowToDisk:内存不足时,是否启用磁盘缓存。          
    diskPersistent:是否缓存虚拟机重启期数据   
    diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒      
    diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区          
    memoryStoreEvictionPolicy:缓存满了之后的淘汰算法。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)          
    <cache name="SimplePageCachingFilter"           
        maxElementsInMemory="10000"           
        eternal="false"          
        overflowToDisk="false"           
        timeToIdleSeconds="900"           
        timeToLiveSeconds="1800"          
        memoryStoreEvictionPolicy="LFU" />    -->  
</ehcache>

该文件是ehcache的配置文件,上面的注释已经说得很清楚了,这里我用的是默认的配置
至此ehcache已经配置好了,然后只需要在你想要缓存的mapper配置文件里面加入以下内容,该查询语句得到的结果将会被缓存

<?xml version="1.0" encoding="UTF-8" ?>   
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.qiuqiu.dao.PersonDao">      
    <!-- 以下两个<cache>标签二选一,第一个可以输出日志,第二个不输出日志 只要在对应的mapper配置文件中加入<cache />标签即可-->    
    <cache type="org.mybatis.caches.ehcache.LoggingEhcache"/>   
    <!-- <cache type="org.mybatis.caches.ehcache.EhcacheCache"/> -->      
    <select id="selectUserById" parameterType="int" resultType="org.qiuqiu.vo.Person">          
        select * from person where id=#{id}   
    </select>  
</mapper>

这样就对这个mapper里面的各种结果进行了缓存。程序中不需要修改任何地方。
这个过程不复杂,也没什么难度,不过Mybatis的官方说的也太含糊了。附件下面有,需要的各种jar包已经包含。点击下载附件
原文地址:http://qiuqiu0034.iteye.com/blog/1162952

二、 springMVC+mybatis+ehcache详细配置

首先需要先需要两个主要的jar包

  • ehcache-core-2.4.6.jar
  • mybatis-ehcache-1.0.1.jar
    ehcache-core一定要1.3以上的版本 因为1.3之前好像不支持集群的。然后需要创建一个ehcache.xml在类路径下面
<?xml version="1.0" encoding="utf-8"?>     
    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd">         
      
    <diskStore path="java.io.tmpdir"/>    
    <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="30" timeToLiveSeconds="30" overflowToDisk="false"/>    
    <!--             
    配置自定义缓存            
    maxElementsInMemory:缓存中允许创建的最大对象数            
    eternal:缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。            
    timeToIdleSeconds:缓存数据的钝化时间,也就是在一个元素消亡之前,                        
                    两次访问时间的最大时间间隔值,这只能在元素不是永久驻留时有效,                        
                    如果该值是 0 就意味着元素可以停顿无穷长的时间。            
    timeToLiveSeconds:缓存数据的生存时间,也就是一个元素从构建到消亡的最大时间间隔值,                                      这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间。            
    overflowToDisk:内存不足时,是否启用磁盘缓存。            
    memoryStoreEvictionPolicy:缓存满了之后的淘汰算法。        
    -->         
    <cache name="testCache"             
    maxElementsInMemory="10000"             
    eternal="true"            
    overflowToDisk="false"             
    timeToIdleSeconds="0"             
    timeToLiveSeconds="600"            
    memoryStoreEvictionPolicy="LFU" />    
</ehcache>

上面的diskStor path 你可以指定某一个路径下,java.io.tmpdir 指的是你系统的缓存目录,可以百度下然后一般这个xml都需要有一个defaultCache,就是默认的cache配置 里面有哪些参数自己可以网上查查api

然后下面我还配置了一个testCache,我找网上资料 没看到哪里明说,然后我自己测试,发现ehcache是可以生成多个cache的,每个cache可以根据不同的业务场景作用于不同的业务(即里面的参数配置不同),所以这样看似多配置了,其实是更加增加了灵活性。

然后在spring的配置文件里面加上一段配置:

<!-- 使用ehcache缓存 -->      
   <bean id="ehCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">    
     <property name="configLocation" value="classpath:ehcache.xml" />    
   </bean>

这样就可以把ehcache和spring整合起来了

然后在对应的mapper.xml 里面加上

<cache type="org.mybatis.caches.ehcache.LoggingEhcache" >    
    <property name="timeToIdleSeconds" value="3600"/><!--1 hour-->    
    <property name="timeToLiveSeconds" value="3600"/><!--1 hour-->    
    <property name="maxEntriesLocalHeap" value="1000"/>    
    <property name="maxEntriesLocalDisk" value="10000000"/>    
    <property name="memoryStoreEvictionPolicy" value="LRU"/>    
</cache>

后面的参数配置不加也可以,都会有一个默认值,大家也可以查查一共有哪些配置,然后根据自己的需要来配置,然后这个配置是会带上cache执行的日志,如果不要带日志可以把LogginEhcache改成EhcacheCache。

在mapper.xml这样设置了默认是全部操作都会执行缓存策略,如果有某些sql不需要执行,可以把useCache设置为false。

<select id="selectByExample" resultMap="BaseResultMap" parameterType="com.anenjoy.manage.entity.TblUserTempExample" useCache="false" >

其实经过这样的配置ehcache已经基本OK了。接下来就测试一下。

原文测试代码如下:

long begin = System.nanoTime();    
        tempService.selectAll();    
        long end = System.nanoTime() - begin;    
        System.out.println("count :" + end);    
        // the second time    
        begin = System.nanoTime();    
        try {    
            tempService.insertTblUserTemp("1", "1", "1", "1");    
        } catch (NoSuchAlgorithmException e) {    
            e.printStackTrace();    
        }    
        end = System.nanoTime() - begin;    
        System.out.println("count :" + end);    
        // the second time    
        begin = System.nanoTime();    
        tempService.selectAll();    
        end = System.nanoTime() - begin;    
        System.out.println("count :" + end);    
        // the third time    
        begin = System.nanoTime();    
        tempService.selectAll();    
        end = System.nanoTime() - begin;    
        System.out.println("count :" + end);    
        return "";

这里面有4条输出语句

首先是查询一次某表 执行了查询sql

然后给某表插入一条信息 执行了插入sql

然后再查询某表 执行了查询sql,这是正确的 因为你执行了非查询语句,这个时候需要重新访问数据库

然后再一次查询某表 没有执行查询sql 这代表缓存是有用的,他就没有访问数据库了,直接从内存或者磁盘里面获取了

也可以根据count来查看操作的时间

count :681719

————————————————-com.anenjoy.manage.mapper.TblUserTempMapper.insert

insert into TBLUSERTEMP (ACTIVECODE, PASSWORDMD5, PASSWORDRANDOMKEY,

PHONE, EMAIL, USERNAME,

AWARTAR, STATUS, CREATEDATE,

USERID, IMSI, CHECKCODE

)

values (?, ?, ?,

?, ?, ?,

?, ?, ?,

?, ?, ?

)

count :129557388

————————————————-com.anenjoy.manage.mapper.TblUserTempMapper.selectByExample

select

ACTIVECODE, PASSWORDMD5, PASSWORDRANDOMKEY, PHONE, EMAIL, USERNAME, AWARTAR, STATUS,

CREATEDATE, USERID, IMSI, CHECKCODE

from TBLUSERTEMP

count :333938203

count :560704

然后这些基本上OK了

原文地址:http://www.darrenzhong.com/?p=73#codesyntax_6

源码下载:http://pan.baidu.com/s/1jGnATds 解压密码:Darren中博客

总结:以上两种方式我都有试过,也测试过两种方式的效率。在此发表一下个人观点,如有其他观点欢迎大家讨论。

  • 使用ehcache+mybatis的查询效率不如springMVC+mybatis+ehcache的效率高。
  • ehcache.xml配置文件中的<diskStore path="java.io.tmpdir"/>节点使用系统默认缓存位置的效率比使用自定义缓存位置 path="d:\cache"的效率要高。

最后附上我的demo源码:源码下载

源码里加了数据库的sql文件 直接导入即可,之前还试了mybatis数据库的读写分离。但是他们都是独立存在的,并不会互相影响。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容

  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,398评论 0 4
  • 11 MyBatis一级缓存实现# 11.1 什么是一级缓存? 为什么使用一级缓存?## 每当我们使用MyBati...
    七寸知架构阅读 10,806评论 12 143
  • 非本人总结的笔记,抄点笔记复习复习。感谢传智博客及黑马程序猿成长 关联查询 数据中的表结构 数据库的分析方法 第一...
    键盘瞎阅读 1,079评论 3 5
  • MyBatis的配置和使用原理 MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。My...
    王帅199207阅读 903评论 0 4
  • 1 缓存介绍# MyBatis支持声明式数据缓存(declarative data caching)。当一条SQL...
    七寸知架构阅读 2,090评论 2 51