spring ehcache配置以及使用(afterPropertiesSet)

93 篇文章 0 订阅
84 篇文章 0 订阅
spring 配置ehcache例子:[url]http://blog.csdn.net/linfanhehe/article/details/7693091[/url]
[color=red][b]主要特性[/b][/color]
1. 快速.
2. 简单.
[b]3. 多种缓存策略[/b]
4. 缓存数据有两级:内存和磁盘,因此无需担心容量问题
5. 缓存数据会在虚拟机重启的过程中写入磁盘
[b]6. 可以通过RMI、可插入API等方式进行分布式缓存[/b]
7. 具有缓存和缓存管理器的侦听接口
8. 支持多缓存管理器实例,以及一个实例的多个缓存区域
[b]9. 提供Hibernate的缓存实现[/b]

[size=medium][color=red][b]举例说明:timeToLiveSeconds =3600 timeToIdleSeconds =300[/b][/color][/size]

[size=medium][b]以上配置代表缓存有效时间为3600秒(自缓存建立起一个小时有效 ),在有效的一个小时内,如果连续五分钟未访问缓存,则缓存失效,特别说明的是,就算缓存访问从未间断,到一个小时后,缓存也会失效[/b][/size]


<!-- 配置 ehcache -->
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation">
<value>classpath:ehcache.xml</value>
</property>
</bean>
<!-- cacheName ehcache配置文件中的名称 -->
<bean id="mmsCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
<property name="cacheManager" ref="cacheManager" />
<property name="cacheName" value="mmsCache" />
</bean>

<bean id="dataProviderService" class="xxx.DataProviderServiceImpl">
<property name="commonDao">
<ref bean="commonDao" />
</property>
<property name="cache" ref="mmsCache"></property>
</bean>




<ehcache updateCheck="false" name="mmsCache">

<defaultCache
maxElementsInMemory="10000"
eternal="true"
overflowToDisk="true">
</defaultCache>

<cache name="mmsCache"
maxElementsInMemory="10000"
eternal="true"
overflowToDisk="false">
</cache>

</ehcache>




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

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.dao.DataAccessException;

import xxx.dao.cfg.CommonDao;
import xxx.service.cfg.DataProviderService;


public class DataProviderServiceImpl implements DataProviderService,InitializingBean{
private static final Log log = LogFactory.getLog(DataProviderServiceImpl.class);
private net.sf.ehcache.Cache cache;
private CommonDao commonDao;

public Cache getCache() {
return cache;
}
public void setCache(Cache cache) {
this.cache = cache;
}
public CommonDao getCommonDao() {
return commonDao;
}

public void setCommonDao(CommonDao commonDao) {
this.commonDao = commonDao;
}
/**
* InitializingBean 仅仅提供了初始化的方法
*/
@Override
public void afterPropertiesSet() throws Exception {
doCacheMenu();
doCacheUser();
doCacheDeth();
}
private void doCacheMenu() {
String sql = "" ;
// 查询所有开启的菜单
try {
this.put("TMENU", this.commonDao.findNativeSQL(sql,new Object[]{"1","0"}));
log.info("缓存菜单成功!");
} catch (Exception e) {
e.printStackTrace();
log.info("缓存菜单失败!");
}
}
private void doCacheUser() {
// 查询所有用户
try {
this.put("TUSER", this.commonDao.find("from Tuscuser t"));
log.info("缓存用户成功!");
} catch (DataAccessException e) {
e.printStackTrace();
log.info("缓存用户失败!");
}
}
private void doCacheDeth(){
// 查询所有部门
try {
this.put("TDEPT", this.commonDao.find("from Tuscdept t"));
log.info("缓存部门成功!");
} catch (DataAccessException e) {
e.printStackTrace();
log.info("缓存部门失败!");
}
}

public Object get(String key) {
return cache.get(key)!=null?cache.get(key).getObjectValue():key ;
}
public void put(String key, Object value) {
cache.put(new Element(key,value));
}
public void reloadAllCache() {
cache.flush();
}
public void reloadCacheByType(String type) {
// 缓存菜单
if("TMENU".equals(type)){
doCacheMenu();
}
// 刷新用户
if("TUSER".equals(type)){
doCacheUser();
}
// 刷新部门
if("TDEPT".equals(type)){
doCacheDeth();
}
}
}






<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<!--timeToIdleSeconds 当缓存闲置n秒后销毁 -->
<!--timeToLiveSeconds 当缓存存活n秒后销毁 -->
<!--
缓存配置
name:缓存名称。
maxElementsInMemory:缓存最大个数。
eternal:对象是否永久有效,一但设置了,timeout将不起作用。
timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。
diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
maxElementsOnDisk:硬盘最大缓存个数。
diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
clearOnFlush:内存数量最大时是否清除。
-->
<diskStore path="java.io.tmpdir" />
<defaultCache
maxElementsInMemory="500"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="1200"
overflowToDisk="true" />
<cache name="com.Menu" maxElementsInMemory="150"
eternal="false" timeToLiveSeconds="36000"
timeToIdleSeconds="3600" overflowToDisk="true"/>
</ehcache>


[color=red][b]EhcacheUtil工具类使用
[/b][/color]


public class EhcacheUtil {

private static final String path = "/ehcache.xml";

private URL url;

private CacheManager manager;

private static EhcacheUtil ehCache;

private EhcacheUtil(String path) {
url = getClass().getResource(path);
manager = CacheManager.create(url);
}

public static EhcacheUtil getInstance() {
if (ehCache== null) {
ehCache= new EhcacheUtil(path);
}
return ehCache;
}

public void put(String cacheName, String key, Object value) {
Cache cache = manager.getCache(cacheName);
Element element = new Element(key, value);
cache.put(element);
}

public Object get(String cacheName, String key) {
// 通过名称获取cache cacheName在ehcache.xml上定义
Cache cache = manager.getCache(cacheName);
Element element = cache.get(key);
return element == null ? null : element.getObjectValue();
}

public Cache get(String cacheName) {
return manager.getCache(cacheName);
}

public void remove(String cacheName, String key) {
Cache cache = manager.getCache(cacheName);
cache.remove(key);
}

}


[color=red][b]单独使用ehcache[/b][/color]


//从classes目录查找ehcache.xml配置文件
CacheManager cacheManager = CacheManager.getInstance();

//从classes目录查找指定名称的配置文件
//CacheManager cacheManager = CacheManager.create(getClass().getResource("/ehcache.xml"));

//根据配置文件获得Cache实例
Cache cache = cacheManager.getCache("CACHE1");

//清空Cache中的所有元素
cache.removeAll();

//往Cache中添加元素
cache.put(new Element("s1", "11111"));
cache.put(new Element("s2", "22222"));
cache.put(new Element("s3", "33333"));

//从Cache中取得元素
Element e = cache.get("s3");
System.out.println(e.getValue());

//卸载缓存管理器
cacheManager.shutdown();


[color=red][b]页面缓存[/b][/color]

在web.xml文件中配置过滤器。此处对test_tag.jsp页面进行缓存。


<filter>
<filter-name>testPageCachingFilter</filter-name>
<filter-class>net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>testPageCachingFilter</filter-name>
<url-pattern>/test_tag.jsp</url-pattern>
</filter-mapping>


在ehcache.xml文件中配置Cache节点。
[color=red][b]注意:cache的name属性必需为SimplePageCachingFilter。[/b][/color]


<cache name="SimplePageCachingFilter"
maxElementsInMemory="10"
overflowToDisk="true"
eternal="false"
timeToIdleSeconds="100"
timeToLiveSeconds="100"
memoryStoreEvictionPolicy="LFU" />
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值