`

缓存框架-Ehcache学习笔记

阅读更多

Ehcache也可以做分布是缓存,分布是缓存参考地址:

   http://www.cnblogs.com/yangy608/archive/2011/10/07/2200669.html

 

一、Ehcache缓存框架工作原理

    将ehcache-core-2.4.8.jar加入到项目中后,web项目启动后Ehcache就会启动(没有提供在web.xml启动加载的接口)。
    添加了缓存,当数据有改动的时候,需要清除缓存,如有对数据做增加和修改的时候需要清除相关联的缓存。

    CacheManager 在使用之后应该关闭,虽然有自己的 shutdown hook ,建议在程序中手动关闭。

    CacheManager.getInstance().shutdown();

 

二、CacheManager对象的创建方式

      1、无参

           CacheManager manager = new CacheManager();

              说明:Ehcache在启动的时候会扫描classes目录下的ehcache.xml配置文件,创建CacheManager对象,如果将ehcache.xml文件放到classes目录下,可以通过无参形式加载配置文件;

 

      2、通过配置文件

           CacheManager manager = new CacheManager("E:\tomcat.6.0.37\webapps\easyUiPowerManage\WEB-INF\ehcache.xml");

          说明:如果没有将配置文件放在classes目录下,则在ehcache启动的时候找不到配置文件,没有创建CacheManager对象,所以在加载配置文件的时候需要通过路径来加载配置文件;

 

      3、通过资源

            URL url = getClass().getResource("/anotherconfigurationname.xml");

            CacheManager manager = new CacheManager(url);

 

      4、通过输入流

            InputStream fis = new FileInputStream(new File("src/config/ehcache.xml").getAbsolutePath());

            try {

                  CacheManager manager = new CacheManager(fis);

            } finally {

                  fis.close();

            }

 

三、mybatis+Ehcache简单实现缓存需要的jar包:

    ehcache-core-2.4.8.jar
    slf4j-api-1.7.5.jar
    slf4j-log4j12-1.7.5.jar
    mybatis-ehcache-1.0.0.jar(需不需要还么没确定)

 

四、例子

    1、Ehcache配置文件“ehcache.xml”

<?xml version="1.0" encoding="UTF-8"?>    
		<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" updateCheck="false">    
		<diskStore path="java.io.tmpdir" />  

		<!-- 默认缓存配置 -->
		<defaultCache maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="0" timeToLiveSeconds="600" overflowToDisk="false" 
			diskPersistent="false" memoryStoreEvictionPolicy="LRU" /> 
		   
		<!-- 
			自定义,service缓存配置 
			eternal:					缓存是否永远不销毁
			maxElementsInMemory:		缓存可以存储的总记录量
			overflowToDisk:				当缓存中的数据达到最大值时,是否把缓存数据写入磁盘
			diskPersistent:				是否启用强制命令将缓存出入磁盘
			timeToIdleSeconds:			当缓存闲置时间超过该值,则缓存自动销毁,如果该值是0就意味着元素可以停顿无穷长的时间
			timeToLiveSeconds:			缓存数据的生存时间,也就是一个元素从构建到消亡的最大时间间隔值, 这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间
			memoryStoreEvictionPolicy:	缓存满了之后的淘汰算法
		-->  
		<cache name="serviceCache"
			eternal="false"	
			maxElementsInMemory="1000"   
			overflowToDisk="false"   
			diskPersistent="false"    
			timeToIdleSeconds="0"   
			timeToLiveSeconds="3600"
			memoryStoreEvictionPolicy="LRU" />   
		</ehcache>

 

 

    2、缓存父类管理类“EhCacheManager.java”

package com.util;  
  
import java.io.Serializable;  
import net.sf.ehcache.CacheManager;  
import net.sf.ehcache.Ehcache;  
import net.sf.ehcache.Element;  
import org.apache.commons.logging.Log;  
import org.apache.commons.logging.LogFactory;  
  
/** 
 * 缓存管理类 
 */  
public class EhCacheManager {  
    private static Log log = LogFactory.getLog(EhCacheManager.class);  
    private static final String CACHE_KEY = "serviceCache";  
    public static final int CACHE_LIVE_SECONDS = 180;  
    private static EhCacheManager instance = new EhCacheManager();  
    private static CacheManager cacheManager;  
    private static Ehcache fileCache;  
  
    private EhCacheManager() {  
        log.info("Init file cache ----------------------------------------");  
        cacheManager = new CacheManager();  
        fileCache = cacheManager.getCache(CACHE_KEY);  
        log.info("Init file cache success....");  
    }  
  
    public static synchronized EhCacheManager getInstance() {  
        if (instance == null) {  
            instance = new EhCacheManager();  
        }  
        return instance;  
    }  
  
    public static byte[] loadFile(String key) {  
        Element e = fileCache.get(key);  
        if (e != null) {  
            Serializable s = e.getValue();  
            if (s != null) {  
                return (byte[]) s;  
            }  
        }  
        return null;  
    }  
  
    public static void cacheFile(String key, byte[] data) {  
        fileCache.put(new Element(key, data));  
    }  
      
    /** 
     * 将数据存入缓存,缓存无时间限制 
     * @param key 
     * @param value 
     */  
    public static  <T> void put(String key,T value){  
        fileCache.put(new Element(key, value));  
    }  
      
    /** 
     * 带过期时间的缓存,存入 
     * @param key  键 
     * @param value 值 
     * @param timeToLiveSeconds 缓存过期时间 
     */  
    public static  <T> void put(String key,T value,int timeToLiveSeconds){  
        fileCache.put(new Element(key, value,0,timeToLiveSeconds));  
    }  
      
      
    /** 
     * 通过key值获取存入缓存中的数据 
     * @param key   数据存入缓存时的key 
     */  
    @SuppressWarnings("unchecked")  
    public static <T> T get(String key) {  
        Element el = fileCache.get(key);  
        if (el == null) {  
            if (log.isDebugEnabled())  
                log.debug("not found key: " + key);  
            return null;  
        }  
        
        T t = (T) el.getObjectValue();  
        return t;  
    }  
  
      
    /** 
     * 根据key删除缓存 
     */  
    public static boolean  remove(String key) {  
        log.info("remove key:"+key);  
        return fileCache.remove(key);  
    }  
    
    /**
     * 关闭cacheManager 对象
     */
    public static void shutdown() {  
        cacheManager.shutdown();  
    }  
}

   

    3、使用了缓存的类"UserServiceImpl.java"

package com.service.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.dao.UserDao;
import com.entity.User;
import com.service.UserService;
import com.util.EhCacheManager;

/**
 * 用户管理service实现类
 */
@Service(value="userService")
public class UserServiceImpl implements UserService {
	@Autowired
	private UserDao userDao;
	
	private final static String GET_USER_KEY = "GET_USER_KEY_";  
	
	/**
	 * 增加或修改用户
	 */
	public int userOperate(User user){
		if(user.getId() == null){
			return userDao.addUser(user);
		}else{
			return userDao.updateUser(user);
		}
	}
	
	/**
	 * 删除用户
	 */
	public int deleteUser(String id) {
		Map<String,Object> params = new HashMap<String, Object>();
		params.put("id",id);
		
		//根据id查询用户
		List<User> listUser = userDao.getUser(params);
		
		//删除之前登录保存的缓存
		if(listUser.size() > 0){
			User user = listUser.get(0);
			EhCacheManager.remove(GET_USER_KEY+user.getAccount()+"_"+user.getPassword());
		}
		
		return userDao.deleteUser(id);
	}
	
	/**
	 * 用户登录,从缓存中取数据,如果没有就查数据库
	 */
	public List<User> getUserDenglu(Map<String,Object> params) {
		//到缓存中取数据
		List<User> listUser = EhCacheManager.get(GET_USER_KEY+params.get("account")+"_"+params.get("password"));  
		
		//如果没有则去数据库查询
        if(listUser == null){  
            listUser =  userDao.getUserDenglu(params);  
            //将取到的数据保存到缓存中
            EhCacheManager.put(GET_USER_KEY+params.get("account")+"_"+params.get("password"), listUser);  
        }  
        
        return listUser;
	}
	
	/**
	 * 查询用户
	 */
	public List<User> getUser(Map<String,Object> params){
		return userDao.getUser(params);
	}
	
	/**
	 * 查询用户总数
	 */
	public int getUserCount(Map<String,Object> params){
		return userDao.getUserCount(params);
	}
}

 

    4、删除缓存

    EhCacheManager.remove(GET_USER_KEY+params.get("account")+"_"+params.get("password"));

   

分享到:
评论

相关推荐

    通信仿真-JavaWeb-mast开发笔记

    这包括了减少HTTP请求、优化数据库查询、使用缓存策略(如 Ehcache 或 Redis)、以及利用负载均衡和集群技术来提升应用的并发处理能力。 总结起来,"通信仿真-JavaWeb-mast开发笔记"涵盖了JavaWeb开发中的核心知识...

    ssh学习笔记

    根据提供的文件信息,可以看出这份学习笔记主要关注于SSH(Struts、Spring 和 Hibernate)框架的配置与使用。接下来,我们将详细解析这些知识点。 ### 一、Spring 框架依赖 Spring 是一个开源的轻量级Java开发框架...

    Spring Boot 学习笔记完整教程.pdf

    15. Spring Boot缓存集成:学习如何集成Spring Cache以及特定的缓存实现,例如Redis和EhCache。 16. Spring Boot分布式会话:了解如何在分布式环境中实现会话共享,这在构建集群应用时非常有用。 以上内容只是...

    hibernate API帮助文档 及hibernate学习笔记

    这篇文档和学习笔记将深入介绍Hibernate的核心概念、API用法以及最佳实践。 1. **Hibernate核心概念** - **对象关系映射(ORM)**: Hibernate是ORM的一种实现,它允许开发者使用面向对象的方式来操作数据库,而...

    hibernate学习笔记第二天的源码

    在深入探讨Hibernate学习笔记第二天的源码之前,我们先来理解一下Hibernate的核心概念。Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者将数据库操作转化为对象模型,大大简化了数据访问层的开发...

    mybatis学习笔记

    ### MyBatis学习笔记知识点概览 #### 1. MyBatis入门 ##### 1.1 单独使用JDBC编程问题总结 - **JDBC程序示例**:通过一个具体的示例展示了如何使用JDBC连接数据库并执行SQL查询。 - 加载数据库驱动 - 获取数据库...

    hibernate学习笔记,学习大纲【吐血推荐】

    **Hibernate学习笔记与大纲** Hibernate 是一款开源的Java语言下的对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发人员可以使用面向对象的方式处理数据,而无需过多关注底层的SQL语句。本笔记将深入...

    Hibernate 4 学习笔记

    **标题:** Hibernate 4 学习笔记 **概述:** Hibernate 4 是一个流行的Java对象关系映射(ORM)框架,它允许开发人员在Java应用中处理数据库操作,而无需直接编写SQL语句。这个学习笔记将深入探讨Hibernate 4的核心...

    shiro学习笔记.rar

    本学习笔记主要涵盖了如何在Spring Boot项目中整合Shiro,并实现用户认证和授权,以及图片验证码的实现。 **1. Shiro 概述** Shiro 的核心组件包括 Realm(域)、Subject(当前操作用户)、Session Manager(会话...

    hibernate学习笔记

    **hibernate学习笔记** Hibernate 是一款开源的Java语言下的对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据库事务,而无需过多关注SQL语句的编写。本笔记将围绕...

    Spring学习笔记(内含代码)

    此外,Spring集成了许多其他框架和库,如Quartz定时任务、Email服务、缓存支持(如 Ehcache 和 Redis)以及消息中间件(如 JMS)。 在Spring Boot中,开发者可以快速启动Spring应用,因为它提供了一种默认配置和...

    Hibernate3.3_学习笔记.doc.zip

    《Hibernate3.3_学习笔记》是一份详细记录了Hibernate3.3版本特性和使用方法的文档,旨在帮助开发者深入理解和应用这一强大的对象关系映射(ORM)框架。Hibernate是Java开发中的一个明星库,它简化了数据库操作,...

    [Java学习笔记doc]Hibernate学习教程和笔记

    【Java学习笔记doc】Hibernate学习教程和笔记 Hibernate是一个开源的对象关系映射(ORM)框架,它极大地简化了Java开发者与数据库之间的交互。这个文档集合是针对Java初学者和进阶者的一份宝贵资料,旨在深入理解...

    Hibernate学习笔记(培训学习时的笔记)

    【Hibernate学习笔记】 Hibernate是一个强大的Java对象关系映射(ORM)框架,它简化了数据库与Java应用程序之间的交互。本笔记将深入探讨Hibernate的核心概念、配置、实体管理、查询语言以及事务处理等方面,帮助...

    Hibernate学习笔记!

    **Hibernate学习笔记** Hibernate是一个强大的Java对象关系映射(ORM)框架,它为开发者提供了在Java应用程序中操作数据库的强大工具。本笔记将深入探讨Hibernate的核心概念、配置、实体管理、查询语言以及最佳实践...

Global site tag (gtag.js) - Google Analytics