springMVC+mybatis+ehcache詳細配置

一、 Mybatis+Ehcache配置

    爲了提高MyBatis的性能,有時候我們需要加入緩存支持,目前用的比較多的緩存莫過於ehcache緩存了,ehcache性能強大,而且位各種應用都提供瞭解決方案,在此我們主要是做查詢緩存,提高查詢的效率.

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

  1. ehcache-core-2.4.4.jar

  2. mybatis-ehcache-1.0.0.jar

  3. slf4j-api-1.6.1.jar

  4. 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包

  1. ehcache-core-2.4.6.jar

  2. 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中博客

總結:以上兩種方式我都有試過,也測試過兩種方式的效率。在此發表一下個人觀點,如有其他觀點歡迎大家討論。

  1. 使用ehcache+mybatis的查詢效率不如springMVC+mybatis+ehcache的效率高。

  2. ehcache.xml配置文件中的<diskStore path="java.io.tmpdir"/>節點使用系統默認緩存位置的效率比使用自定義緩存位置 path="d:\cache"的效率要高。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章