javaweb项目搭建ehcache缓存系统

转载自  javaweb项目搭建ehcache缓存系统

EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider,同时在项目开发中也被广泛使用到。接下来就以用户缓存为例,基于javaweb项目来搭建ehcache缓存系统。

主要涉及核心原理和实现要点:项目是基于spring框架来统一管理和配置bean的,所以在spring中配置缓存,定义EhCacheManagerFactoryBean,同时指向其ehcache配置文件ehcache.xml,ehcache.xml则有我们自己根据项目情况来定义一些缓存策略,如:cache中元素的生存时间、cache 中最多可以存放的元素的数量和内存存储与释放策略等等。java代码中则可以定义一个统一的缓存管理类去持有net.sf.ehcache.CacheManager实例,来代理往数据库中操作数据的行为。关于CacheManager实例的获取,则可以通过实现ApplicationContextAware, DisposableBean接口,分别重写其setApplicationContext()方法,注入ApplicationContext到静态变量中和destroy()方法,在ApplicationContext关闭时清理静态变量。这样以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候取出ApplicaitonContext,进而调用其getBean()方法来获得CacheManager实例。拿数据是先getByCache(),若缓存中存在数据则直接返回该数据,若缓存中不存在数据,再执行getByDb(),从数据库中拿数据,同时将数据存进缓存中。

1、首先从web.xml部署文件入口进行配置

<!-- 应用程序Spring上下文配置 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:applicationContext*.xml,</param-value></context-param>
<!-- 自定义监听器 继承自spring上下文加载监听器 --><listener><listener-class>com.schoolnet.sys.listener.WebContextListener</listener-class></listener>

继承自spring上下文加载监听器的WebContextListener类,可以在web启动时做一些处理

WebContextListener .java

public class WebContextListener extends org.springframework.web.context.ContextLoaderListener {@Overridepublic WebApplicationContext initWebApplicationContext(ServletContext servletContext) {if (!printKeyLoadMessage()){return null;}return super.initWebApplicationContext(servletContext);}private static boolean printKeyLoadMessage(){StringBuilder sb = new StringBuilder();sb.append("\r\n======================================================================\r\n");sb.append("\r\n    欢迎使用 校园网  - EhCache缓存系统搭建\r\n");sb.append("\r\n======================================================================\r\n");System.out.println(sb.toString());return true;}
}

2、applicationContex.xml中配置ehcache缓存

<!-- 加载配置属性文件 --><bean id="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="fileEncoding" value="UTF-8" /><property name="locations"><list><value>classpath:schoolnet.properties</value></list></property></bean>
<!-- 缓存配置 --><bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"><property name="configLocation" value="classpath:${ehcache.configFile}" /></bean>

3、schoolnet.properties

ehcache.configFile=cache/ehcache.xml(源码包下的cache文件夹中)

4、ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<ehcache updateCheck="false" name="defaultCache"><diskStore path="../temp/jeesite/ehcache" /><!-- 默认缓存配置. --><defaultCache maxEntriesLocalHeap="100" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600"overflowToDisk="true" maxEntriesLocalDisk="100000" /><!-- 系统缓存 --><cache name="sysCache" maxEntriesLocalHeap="100" eternal="true" overflowToDisk="true"/><!-- 用户缓存 --><cache name="userCache" maxEntriesLocalHeap="100" eternal="true" overflowToDisk="true"/><!-- 系统活动会话缓存 --><cache name="activeSessionsCache" maxEntriesLocalHeap="10000" overflowToDisk="true"eternal="true" timeToLiveSeconds="0" timeToIdleSeconds="0"diskPersistent="true" diskExpiryThreadIntervalSeconds="600"/><!-- 简单页面缓存<cache name="SimplePageCachingFilter" maxEntriesLocalHeap="100" eternal="false" overflowToDisk="true"timeToIdleSeconds="120" timeToLiveSeconds="120" memoryStoreEvictionPolicy="LFU"/> --></ehcache>

一些配置参数的说明

maxElementsInMemory :cache 中最多可以存放的元素的数量。如果放入cache中的元素超过这个数值,有两种情况:1、若overflowToDisk的属性值为true,会将cache中多出的元素放入磁盘文件中。2、若overflowToDisk的属性值为false,会根据memoryStoreEvictionPolicy的策略替换cache中原有的元素。
eternal :意思是是否永驻内存。如果值是true,cache中的元素将一直保存在内存中,不会因为时间超时而丢失,所以在这个值为true的时候,timeToIdleSeconds和timeToLiveSeconds两个属性的值就不起作用了。
timeToIdleSeconds :就是访问这个cache中元素的最大间隔时间。如果超过这个时间没有访问这个cache中的某个元素,那么这个元素将被从cache中清除。
timeToLiveSeconds : 这是cache中元素的生存时间。意思是从cache中的某个元素从创建到消亡的时间,从创建开始计时,当超过这个时间,这个元素将被从cache中清除。
overflowToDisk :溢出是否写入磁盘。系统会根据标签<diskStore path="java.io.tmpdir"/> 中path的值查找对应的属性值,如果系统的java.io.tmpdir的值是 D:/temp,写入磁盘的文件就会放在这个文件夹下。文件的名称是cache的名称,后缀名的data。如:CACHE_FUNC.data。这个属性在解释maxElementsInMemory的时候也已经说过了。
diskExpiryThreadIntervalSeconds  :磁盘缓存的清理线程运行间隔
memoryStoreEvictionPolicy :内存存储与释放策略。有三个值:
LRU -least recently used
LFU -least frequently used
FIFO-first in first out, the oldest element by creation time
diskPersistent : 是否持久化磁盘缓存。当这个属性的值为true时,系统在初始化的时候会在磁盘中查找文件名为cache名称,后缀名为index的的文件,如CACHE_FUNC.index 。这个文件中存放了已经持久化在磁盘中的cache的index,找到后把cache加载到内存。要想把cache真正持久化到磁盘,写程序时必须注意,在是用net.sf.ehcache.Cache的void put (Element element)方法后要使用void flush()方法。

5、CacheUtils.java

/*** Cache工具类*/
public class CacheUtils {private static CacheManager cacheManager = ((CacheManager)SpringContext.getBean("cacheManager"));private static final String SYS_CACHE = "sysCache";/*** 获取SYS_CACHE缓存* @param key* @return*/public static Object get(String key) {return get(SYS_CACHE, key);}/*** 写入SYS_CACHE缓存* @param key* @return*/public static void put(String key, Object value) {put(SYS_CACHE, key, value);}/*** 从SYS_CACHE缓存中移除* @param key* @return*/public static void remove(String key) {remove(SYS_CACHE, key);}/*** 获取缓存* @param cacheName* @param key* @return*/public static Object get(String cacheName, String key) {Element element = getCache(cacheName).get(key);return element==null?null:element.getObjectValue();}/*** 写入缓存* @param cacheName* @param key* @param value*/public static void put(String cacheName, String key, Object value) {Element element = new Element(key, value);getCache(cacheName).put(element);}/*** 从缓存中移除* @param cacheName* @param key*/public static void remove(String cacheName, String key) {getCache(cacheName).remove(key);}/*** 获得一个Cache,没有则创建一个。* @param cacheName* @return*/private static Cache getCache(String cacheName){Cache cache = cacheManager.getCache(cacheName);if (cache == null){cacheManager.addCache(cacheName);cache = cacheManager.getCache(cacheName);cache.getCacheConfiguration().setEternal(true);}return cache;}public static CacheManager getCacheManager() {return cacheManager;}}
6、SpringContext.java,用类获得ApplicationContext实例@Component
public class SpringContext implements ApplicationContextAware,DisposableBean{private static ApplicationContext applicationContext;/*** 取得存储在静态变量中的ApplicationContext.*/@Overridepublic void setApplicationContext(ApplicationContext context)throws BeansException {try {applicationContext=context;} catch (Exception e) {e.printStackTrace();}}/*** 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.*/public static <T> T getBean(String name){return (T) applicationContext.getBean(name);}public static String[] getBeanNamesForType(Class<?> type){return applicationContext.getBeanNamesForType(type);}/*** 实现DisposableBean接口, 在Context关闭时清理静态变量.*/@Overridepublic void destroy() throws Exception {applicationContext = null;}
}

7、UserUtils.java

/*** 用户工具类*/
public class UserUtils {private static UserDao userDao = SpringContextHolder.getBean(UserDao.class);private static Map<String, Object> cacheMap;/*** 根据ID获取用户* @param id* @return 取不到返回null*/public static User getUser(String id){User user = (User)CacheUtils.get("userCache", "id_" + id);if (user ==  null){user = userDao.get(id);if (user == null){return null;}CacheUtils.put("userCache", "id_" + user.getId(), user);CacheUtils.put("userCache", "ln" + user.getLoginName(), user);}return user;}/*** 根据登录名获取用户* @param loginName* @return 取不到返回null*/public static User getByLoginName(String loginName){User user = (User)CacheUtils.get("userCache", "ln" + loginName);if (user == null){user = userDao.getByLoginName(new User(null, loginName));if (user == null){return null;}CacheUtils.put("userCache", "id_" + user.getId(), user);CacheUtils.put("userCache", "ln" + user.getLoginName(), user);}return user;}/*** 清除用户缓存* @param user*/public static void clearCache(User user){CacheUtils.remove("userCache", "id_" + user.getId());CacheUtils.remove("userCache", "ln" + user.getLoginName());CacheUtils.remove("userCache", "ln" + user.getOldLoginName());}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328180.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务架构之外的选择——基于服务架构

来自ThoughtWorks的主管Neal Ford在最近的一次演讲中表达了他对企业软件系统架构转型的看法&#xff0c;他认为从单体架构转向基于服务的架构要比转向微服务架构来得容易。Ford在UberConf 2016大会上做了一次关于基于服务架构的演讲&#xff0c;基于服务架构是介于面向服务架构…

html5中 save方法,如何HTML5画布另存为窗口8 Metro应用中的图像文件?(How to save html5 c...

var myImage canvas.toDataURL("image/png");我认为myImage在现在png格式如何保存编码的图像字节myImage作为一个文件(图片文件夹)&#xff1f;Answer 1:而不是使用的.toDataUrl &#xff0c;你需要使用.msToBlob &#xff1a;var blob canvas.msToBlob();然后&…

系统架构师8

软考——系统架构设计师工作日志 《E:\Myproject\利亚德\x系统架构设计师\系统架构设计师工作日志.txt》 系统架构设计师 ok --》主要信息 官方&#xff1a; 人事考试服务频道.mht http://www.bjld.gov.cn/bjpta/ 北京人事考试 http://www.bjld.g…

Autofac 之 基于 Castle DynamicProxy2 的 Interceptor 功能

Autofac 结合 Castle DynamicProxy2 功能 Autofac 不仅作为轻量级高效的 IoC 容器&#xff0c;而且还能很好的与 Castle.DynamicProxy2 结合起来&#xff0c;实现 AOP 功能。 首先&#xff0c;我们需要定义拦截器&#xff0c;简单的定义可实现 Castle.DynamicProxy.IIntercepto…

类和对象运行时在内存里是怎么样的?各种变量、方法在运行时是怎么交互的?

转载自 类和对象运行时在内存里是怎么样的&#xff1f;各种变量、方法在运行时是怎么交互的&#xff1f;在回答这个问题之前先了解一下Java的一些基础知识。我们知道Java程序运行在虚拟机环境里&#xff0c;那我们先看一下虚拟机的大致内存结构。如下图所示&#xff0c;虚线框…

java通过commons-fileupload实现多张图片的上传(jsp页面)

<div id"middle"><div id"form"><form action"ProductInfoServlet?tagadd" method"post" enctype"multipart/form-data" ><h2>三只松鼠--新增</h2><table align"center">&l…

系统架构师7

2017年11月11日 软件系统架构师考试经验分享 置顶 2017年11月13日 15:25:53 凌飞安 阅读数 7812 版权声明&#xff1a;原创作品&#xff0c;转载请注明出处&#xff01;个人主页 http://www.lingfeian.com https://blog.csdn.net/lingfeian/article/details/78520808 系统架构…

工业利用计算机实现生产自动化属于,自动化考试试题(含答案)

第一类&#xff1a;填空题一&#xff0e;填空题1&#xff0e;自动化控制系统按被控量的时间特性分为(连续量)和(离散量)。2&#xff0e;PLC 全称为(可编程序逻辑控制器)&#xff0c;DCS全称为( 集散控制系统)。3&#xff0e;输入输出单元是(PLC)与工业过程控制现场之间的连接部…

保定有国家承认的计算机学校吗,河北省122所大学名单,不在名单内的都是国家不承认的野鸡学校...

原标题&#xff1a;河北省122所大学名单&#xff0c;不在名单内的都是国家不承认的野鸡学校据教育部官网信息显示&#xff0c;截至2019年6月15日&#xff0c;河北省共有普通高等学校122所&#xff0c;其中本科院校61所&#xff0c;专科院校61所。在名单中虽然有一所211院校&…

从Java类到对象的创建过程都做了些啥?内存中的对象是啥样的?

转载自 从Java类到对象的创建过程都做了些啥&#xff1f;内存中的对象是啥样的&#xff1f;先回顾一下Java程序执行的过程&#xff1a;Java程序执行时&#xff0c;第一步系统创建虚拟机进程&#xff0c;然后虚拟器用类加载器Class Loader加载java程序类文件到方法区。方法区放…

ASP.NET Core MVC TagHelper实践HighchartsNET快速图表控件

ASP.NET Core MVC TagHelper最佳实践HighchartsNET快速图表控件支持ASP.NET Core。 曾经在WebForms上写过 HighchartsNET快速图表控件-开源 Highcharts的ASP.NET Web自定义控件。 今天我就来改造它&#xff0c;将其使用最新的TagHelper 来实践&#xff0c;学习TagHelper 的使用…

架构师6

系统架构师考试总结 2019年06月11日 10:48:47 devillyd2018 阅读数 103 2011年11月12日&#xff0c;在这个百年一遇的大单身节的第二天&#xff0c;我怀着无比紧张的心情走进了系统架构师的考场。 虽然暂时还不知道我的成绩&#xff0c;无所谓啦&#xff0c;虽然答的一般&…

计算机视觉论文doc,嘉炬-计算机视觉论文资料.doc

成 绩评卷人姓 名嘉炬学 号华 中 师 范 大 学研 究 生 课 程 论 文论文题目 计算机视觉技术在教育领域的应用完成时间 2015年1月15日课程名称 计算机视觉专 业 通信与信息系统年 级 2014级注&#xff1a;研究生须在规定期限内完成课程论文&#xff0c;并用A4页面打印&#xff0…

Oracle数据库基本概念理解(1)

--函数 数字转换为字符 --0 强制位数&#xff0c;9位数不够不显示 $美元 SELECT TO_CHAR(124.3456,0000.00) FROM dual ; SELECT TO_CHAR(124.3456,9999.99) FROM dual ; SELECT TO_CHAR(124.3456,$9999.99) FROM dual ; --日期 日期转换为字符 SELECT TO_CHAR(SYSDATE,YY…

关于Heap Dump

转载自 关于Heap DumpHeap Dump是什么&#xff1f; Heap Dump也叫堆转储文件&#xff0c;是一个Java进程在某个时间点上的内存快照。Heap Dump是有着多种类型的。不过总体上heap dump在触发快照的时候都保存了java对象和类的信息。通常在写heap dump文件前会触发一次FullGC&a…

使用StyleCop 进行代码评审

使用StyleCop对原代码进行审查&#xff0c;看编写的代码是否遵循设计规范、.Net约定和一些贯用法等。保证代码的一致性&#xff0c;可读性等等。 在此之前&#xff0c;先简单介绍下FxCop&#xff08;起初只是微软内部使用的工具&#xff09;,一个分析托管程序集&#xff0c;检测…

系统架构师5 ***********那就给个合格分了。111

https://download.csdn.net/download/sun_lq/11109495 https://download.csdn.net/download/u011669055/10736374 https://download.csdn.net/download/robertsoft/10747039 十年IT从业背景&#xff0c;一次考试通过系统分析师(通过系统分析师的学习 ... [复制链接] 发表于 …

2012三年大专计算机试题医学,计算机原理2012年4月真题(02384)

计算机原理2012年4月真题及答案解析(02384)计算机原理2012年4月真题及答案解析(02384)&#xff0c;该试卷为计算机原理自考历年真题试卷&#xff0c;包含答案及详细解析。一、单项选择题(本大题共15小题&#xff0c;每小题2分&#xff0c;共30分)在每小题列出的四个备选项中只有…

JVM内存管理------JAVA语言的内存管理概述

转载自 JVM内存管理------JAVA语言的内存管理概述引言 内存管理一直是JAVA语言自豪与骄傲的资本&#xff0c;它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节&#xff0c;只专注于业务逻辑。不过世界上不存在十全十美的好事&#xff0c;在带来了便利的同时&#xf…

微软市值今天涨了 250 亿,这家离我们越来越远的公司,为什么生意反倒越来越好了?

纳德拉上台两年半&#xff0c;微软市值已经涨了 50% 今天早上&#xff0c;微软发布了今年第三季度的财报。受云计算和 Office 业务推动&#xff0c;财报后的盘后交易里&#xff0c;微软股价上涨 5.9%、市值涨了超过 250 亿美元——收购 LinkedIn 的钱差不多就回来了。 财报发布…