1. 程式人生 > >Hibernate中使用分散式快取ehcache-core-1.3.0

Hibernate中使用分散式快取ehcache-core-1.3.0

前言

廢話不多說,來這看的,不管你是會ehcache或者從來沒接觸過的,保證看過之後,都能構建一個自己的ehcache專案。因為我在寫這篇部落格的時候,是一邊在配置一邊在記錄過程中遇到的問題,等於是在手把手教學。下面直入正題。

一、下載相關jar包

網上下載ehcache-core-1.3.0.jar這個jar包。

然後專案引用日誌包:slf4j-api-1.7.5.jar、slf4j-log4j12-1.7.5.jar、log4j-1.2.12.jar

建議:不要使用與hibernate不匹配的ehcache版本,如ehche-core-2.7.0,否則可能客戶端程式碼出現異常

二、配置相關配置檔案

新建ehcache.xml,放在src目錄下,檔案內容如下:

<?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"/>

    <cacheManagerEventListenerFactory class="" properties=""/>

    <defaultCache
        maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="120"
        timeToLiveSeconds="120"
        overflowToDisk="true"
        diskSpoolBufferSizeMB="30"
        maxElementsOnDisk="10000000"
        diskPersistent="false"
        diskExpiryThreadIntervalSeconds="120"
        memoryStoreEvictionPolicy="LRU"
    />
    
    <!--給工具箱加快取,工具箱不經常變化-->
    <cache name="CAHCE_FOR_TOOLSBOX"
           maxElementsInMemory="20000"
           eternal="false"
           timeToIdleSeconds="1800"
           timeToLiveSeconds="1800"
           overflowToDisk="true"
           maxElementsOnDisk="10000000"
           diskPersistent="false"
           diskExpiryThreadIntervalSeconds="120"
           memoryStoreEvictionPolicy="LRU"
    />
</ehcache>
至於裡面的這些屬性是什麼意思,額,一時半會也解釋不清楚,這個百度上也挺多的,我就不給你們普及這裡的引數意思了。

直接編寫一段測試程式碼,先來測試下:

/*
 * 文 件 名 : com.TestCache.java
 * 建立日期 : 2013-10-20 13:31:37
 * 創 建 者 : qsyang
 */
package com;

import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;

/**
 * <p>Title: </p>
 *
 * <p>Description: </p>
 *
 * @author qsyang
 * @version 1.0
 */
public class TestCache {

    CacheManager cacheManager = new CacheManager();

    public void runCache() {
        Cache cache = cacheManager.getCache("CAHCE_FOR_TOOLSBOX");
        cache.put(new Element("testKey", "testValue"));
        for (Object key : cache.getKeys()) {
            System.out.println("Key:" + key + ",value:" + cache.get(key).getObjectValue());
        }
        cacheManager.shutdown();
    }

    public static void main(String[] args) throws Exception {
        TestCache cl = new TestCache();
        cl.runCache();
    }
}
列印結果:Key:testKey,value:testValue

快取配置成功!

三、配置hibernate配置檔案,並新增二級快取配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.connection.url">
            jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8
        </property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">12344</property>
        <property name="hibernate.connection.pool_size">100</property>
        <property name="hibernate.connection.driver_class">
            com.mysql.jdbc.Driver
        </property>
        <property name="show_sql">true</property>
        <property name="format_sql">false</property>
        <property name="hibernate.cache.provider_class">
            org.hibernate.cache.EhCacheProvider
        </property>
        <property name="hibernate.cache.use_second_level_cache">true</property> 
        <property name="hibernate.cache.use_query_cache">true</property>
        <property name="hibernate.cache.region.factory_class">
            org.hibernate.cache.ehcache.EhCacheRegionFactory
        </property>
        <mapping resource="com/qisentech/hibernate/po/UserPO.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

有的人如果出現

新增diskSpoolBufferSizeMB引數報錯的問題

那麼說明是ehcache版本問題,建議還是使用我指定的版本,有興趣可以研究下其他版本。

然後測試一下二級快取!

        Session s = null;
        try {
            s = HibernateUtil.getSession();
            Query query = s.createQuery("from User");
            //設定使用快取
            query.setCacheable(true);
            List<User> list1 = query.list();
            System.out.println(list1.size());
            List<User> list2 = query.list();
            System.out.println(list2.size());
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            if (s != null) {
                s.close();
            }
        }