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"));
相关推荐
这包括了减少HTTP请求、优化数据库查询、使用缓存策略(如 Ehcache 或 Redis)、以及利用负载均衡和集群技术来提升应用的并发处理能力。 总结起来,"通信仿真-JavaWeb-mast开发笔记"涵盖了JavaWeb开发中的核心知识...
根据提供的文件信息,可以看出这份学习笔记主要关注于SSH(Struts、Spring 和 Hibernate)框架的配置与使用。接下来,我们将详细解析这些知识点。 ### 一、Spring 框架依赖 Spring 是一个开源的轻量级Java开发框架...
15. Spring Boot缓存集成:学习如何集成Spring Cache以及特定的缓存实现,例如Redis和EhCache。 16. Spring Boot分布式会话:了解如何在分布式环境中实现会话共享,这在构建集群应用时非常有用。 以上内容只是...
这篇文档和学习笔记将深入介绍Hibernate的核心概念、API用法以及最佳实践。 1. **Hibernate核心概念** - **对象关系映射(ORM)**: Hibernate是ORM的一种实现,它允许开发者使用面向对象的方式来操作数据库,而...
在深入探讨Hibernate学习笔记第二天的源码之前,我们先来理解一下Hibernate的核心概念。Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者将数据库操作转化为对象模型,大大简化了数据访问层的开发...
### MyBatis学习笔记知识点概览 #### 1. MyBatis入门 ##### 1.1 单独使用JDBC编程问题总结 - **JDBC程序示例**:通过一个具体的示例展示了如何使用JDBC连接数据库并执行SQL查询。 - 加载数据库驱动 - 获取数据库...
**Hibernate学习笔记与大纲** Hibernate 是一款开源的Java语言下的对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发人员可以使用面向对象的方式处理数据,而无需过多关注底层的SQL语句。本笔记将深入...
**标题:** Hibernate 4 学习笔记 **概述:** Hibernate 4 是一个流行的Java对象关系映射(ORM)框架,它允许开发人员在Java应用中处理数据库操作,而无需直接编写SQL语句。这个学习笔记将深入探讨Hibernate 4的核心...
本学习笔记主要涵盖了如何在Spring Boot项目中整合Shiro,并实现用户认证和授权,以及图片验证码的实现。 **1. Shiro 概述** Shiro 的核心组件包括 Realm(域)、Subject(当前操作用户)、Session Manager(会话...
**hibernate学习笔记** Hibernate 是一款开源的Java语言下的对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据库事务,而无需过多关注SQL语句的编写。本笔记将围绕...
此外,Spring集成了许多其他框架和库,如Quartz定时任务、Email服务、缓存支持(如 Ehcache 和 Redis)以及消息中间件(如 JMS)。 在Spring Boot中,开发者可以快速启动Spring应用,因为它提供了一种默认配置和...
《Hibernate3.3_学习笔记》是一份详细记录了Hibernate3.3版本特性和使用方法的文档,旨在帮助开发者深入理解和应用这一强大的对象关系映射(ORM)框架。Hibernate是Java开发中的一个明星库,它简化了数据库操作,...
【Java学习笔记doc】Hibernate学习教程和笔记 Hibernate是一个开源的对象关系映射(ORM)框架,它极大地简化了Java开发者与数据库之间的交互。这个文档集合是针对Java初学者和进阶者的一份宝贵资料,旨在深入理解...
【Hibernate学习笔记】 Hibernate是一个强大的Java对象关系映射(ORM)框架,它简化了数据库与Java应用程序之间的交互。本笔记将深入探讨Hibernate的核心概念、配置、实体管理、查询语言以及事务处理等方面,帮助...
**Hibernate学习笔记** Hibernate是一个强大的Java对象关系映射(ORM)框架,它为开发者提供了在Java应用程序中操作数据库的强大工具。本笔记将深入探讨Hibernate的核心概念、配置、实体管理、查询语言以及最佳实践...