Hibernate中使用分散式快取ehcache-core-1.3.0
阿新 • • 發佈:2019-01-29
前言
廢話不多說,來這看的,不管你是會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>
直接編寫一段測試程式碼,先來測試下:
列印結果:Key:testKey,value:testValue/* * 文 件 名 : 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(); } }
快取配置成功!
三、配置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();
}
}