EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。

那么。如何搭建Ehcache的开发环境呢?

1、下载相关的jar包,这些jar包分别是:ehcache_2.10.1.jar、slf4j、log4j

2、编写配置文件ehcache.xml

好了,完成之后的项目结构图如下所示:

在Ehcache框架中,最重要的就是CacheManager这个类,那么,要如何得到这个类的一个实例呢?可以通过调用该类的静态方法create、getInstance和newInstance来得到该类的一个实例。以下,就是这三个方法的在CacheManager类中的实现源代码:

create方法:

public static CacheManager create(String configurationFileName) throws CacheException {
if (singleton != null) {
LOG.debug("Attempting to create an existing singleton. Existing singleton returned.");
return singleton;
}
synchronized (CacheManager.class) {
if (singleton == null) {
singleton = newInstance(configurationFileName);
} else {
LOG.debug("Attempting to create an existing singleton. Existing singleton returned.");
}
return singleton;
}
}

getInstance方法:

public static CacheManager getInstance() throws CacheException {
return CacheManager.create();
}

newInstance方法:

public static CacheManager newInstance() throws CacheException {
return newInstance(ConfigurationFactory.parseConfiguration(), "Creating new CacheManager with default config");
}

而singleton的定义为:

/**
* The Singleton Instance.
*/
private static volatile CacheManager singleton;

换句话说,getInstance首先会判断Singleton是否为空,不为空,返回当前的Singleton值,只有为空的时候,才调用newInstance创建一个Singleton返回。而newInstance则直接创建一个Singleton来返回。

好了,到目前为止,我们知道了如何得到一个CacheManager实例,现在就让我们用这个实例对象来进行缓存操作。

好了,让我们先来看看CacheUnits类的源代码:

public class CacheUnits {
private static CacheManager cacheManager = CacheManager.create("src/ehcache.xml"); private 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 void put(String cacheName , String key , Object obj)
{
Element element = new Element(key , obj);
getCache(cacheName).put(element);
} //从缓存中取出数据
public Object get(String cacheName , String key)
{
Element element = getCache(cacheName).get(key); return element == null ? null : element.getObjectValue();
} //移除缓存中的数据
public void remove(String cacheName , String key)
{
getCache(cacheName).remove(key);
}
}

好了,再让我们写一个类来结合该CacheUnits和Mybatis数据库实现:当要读取的数据不存在于缓存中的时候,从数据库中找到相关的数据,并将其写入到缓存中,如果,缓存中存在这个数据的话,那么久不从数据库中取出该数据,而是直接从缓存中取出这条数据,从而避免频繁的读取数据库,是性能降低。

public class CacheServlet {
private static final String CACHE_PERSON_ID = "person_id_";
private static final String CACHE_PERSON_NAME = "person_name_";
private static final String CACHE_PERSON_ID_NUM = "person_id_num_";
PerDao dao = new PerDao();
CacheUnits cacheUnits = new CacheUnits(); public List<person> searchAll()
{
return dao.search(new person());
} public person searchById(int id)
{
person result = (person) cacheUnits.get("personCache" , CACHE_PERSON_ID + id);
System.out.println(result);
if(result == null)
{
List<person> list = dao.search(new person(id));
if(list == null || list.size() == 0)
return null;
result = list.get(0);
cacheUnits.put("personCache" , CACHE_PERSON_ID+id , result);
} return result;
} public person searchByName(String name)
{
person result = (person)cacheUnits.get("personCache", CACHE_PERSON_NAME + name);
if(result == null)
{
List<person> list = dao.search(new person(name));
if(list == null || list.size() == 0)
{
return null;
} result = list.get(0);
cacheUnits.put("personCache", CACHE_PERSON_NAME + name , result);
} return result;
} public person searchByIdNum(String id_num)
{
person result = (person)cacheUnits.get("personCache", CACHE_PERSON_ID_NUM + id_num);
if(result == null)
{
person per = new person();
per.setId_num(id_num);
List<person> list = dao.search(per);
if(list == null || list.size() == 0)
{
return null;
} result = list.get(0);
cacheUnits.put("personCache", CACHE_PERSON_ID_NUM + id_num , result);
} return result;
}
}

在该类中,分为通过id、name和id_num三种方式查询相关数据,当缓存中不存在下相关数据的时候,通过读写数据库来获取相关数据,然后再将其写入到缓存中,从而使下一次要获取相关的数据的时候,不再需要从数据库中读取,直接从缓存中就能够取出相关数据。

下面,让我们看看ehcache.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<ehcache updateCheck="false" name="defaultCache"> <diskStore path="java.io.tepdir" /> <!-- 默认缓存配置. -->
<defaultCache maxEntriesLocalHeap="100" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600"
overflowToDisk="true" maxEntriesLocalDisk="100000" /> <!-- 用户缓存 -->
<cache name="userCache" maxEntriesLocalHeap="100" eternal="true" overflowToDisk="true"/>
</ehcache>

  

好了,到目前为止,相信读者也能够使用Ehcache实现简单的缓存功能。

至于其他类的源代码以及配置文件的写法,请参照上一篇博文。

Ehcache入门(一)——开发环境的搭建的更多相关文章

  1. JBPM4入门——3.JBPM4开发环境的搭建

    本博文只是简要对JBPM4进行介绍,如需更详细内容请自行google 链接: JBPM入门系列文章: JBPM4入门——1.jbpm简要介绍 JBPM4入门——2.在eclipse中安装绘制jbpm流 ...

  2. windows下vue开发环境的搭建

    一 介绍: vue.js是什么? Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库 ...

  3. CAD控件,CAD插件使用教程:Android开发使用控件--开发环境的搭建

    Android开发使用控件入门--环境搭建 2014-12-24 09:57     14人阅读     评论(0)     收藏         编辑     删除 CAD控件.CAD三维控件,手机 ...

  4. arm-linux下qt + opencv开发环境的搭建(Altera DE1 Soc)

    arm-linux-gnueabihf-gcc下载 qt下载 arm-linux下qt + opencv开发环境的搭建(Altera DE1 Soc) Ubuntu 16.04 安装QT arm嵌入式 ...

  5. 总结:Mac前端开发环境的搭建(配置)

    新年新气象,在2016年的第一天,我入手了人生中第一台自己的电脑(大一时好友赠送的电脑在一次无意中烧坏了主板,此后便不断借用别人的或者网站的).macbook air,身上已无分文...接下来半年的房 ...

  6. Idea开发环境中搭建Maven并且使用Maven打包部署程序

    1.配置Maven的环境变量 a.首先我们去maven官网下载Maven程序,解压到安装目录,如图所示: b.配置M2_HOME的环境变量,然后将该变量添加到Path中 备注:必须要有JAVA_HOM ...

  7. Linux学习心得之 Linux下命令行Android开发环境的搭建

    作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Linux学习心得之 Linux下命令行Android开发环境的搭建 1. 前言2. Jav ...

  8. Java开发环境的搭建以及使用eclipse从头一步步创建java项目

    一.java 开发环境的搭建 这里主要说的是在windows 环境下怎么配置环境. 1.首先安装JDK java的sdk简称JDK ,去其官方网站下载最近的JDK即可..http://www.orac ...

  9. Linux环境下Android开发环境的搭建

    本文主要介绍在Ubuntu下Android开发环境的搭建,所使用的IDE为Eclipse(Android Studio同理,且可省去配置SDK以及安装adt插件的步骤). 1.安装JDK (1)JDK ...

  10. Apache+MySQL+PHP开发环境的搭建(二)

    通过自主选择相应的apache,mysql,php等软件,根据自己的应用开发需求进行安装.此方法搭建的环境自主性较强,搭建过程较为复杂,繁琐. 1.所需软件: Apache: http-2.2.22- ...

随机推荐

  1. JS之路——日期函数

    时间对象是一个我们经常要用到的对象,无论是做时间输出.时间判断等操作时都与这个对象离不开.除开JavaScript中的时间对象外,在VbScript中也有许多的时间对象,而且非常好用.下面还是按照我们 ...

  2. Swift互用性:采用Cocoa设计模式(Swift 2.0版)-b

    本页包含内容: 委托(Delegation) 错误处理(Error Handling) 键值观察(Key-Value Observing) Target-Action模式(Target-Action) ...

  3. c语言里用结构体和指针函数实现面向对象思想

    一.基础研究 观察如下两个程序a.c和b.c: A.c: B.c: 这两个程序都是要实现在屏幕上第10行40列打印一个绿色的字符c: 这两个程序的数据组织方式是一样的,都是使用结构体,而且对共性和个性 ...

  4. hdu GCD and LCM

    题意:gcd(a,b,c)=g; lcm(a,b,c)=l; 求出符合的a,b,c的所有情况有多少中. 思路:l/g=p1^x1*p2^x2*p3^x3.....;   x/g=p1^a1*p2^a2 ...

  5. poj 2983Is the Information Reliable?

    http://poj.org/problem?id=2983 #include<cstdio> #include<cstring> #include<algorithm& ...

  6. tomcat thread dump 分析【转载】

    前言 Java Thread Dump 是一个非常有用的应用诊断工具, 通过thread dump出来的信息, 可以定位到你需要了解的线程, 以及这个线程的调用栈. 如果配合linux的top命令, ...

  7. mapreduce框架详解【转载】

    [本文转载自:http://www.cnblogs.com/sharpxiajun/p/3151395.html] 开始聊mapreduce,mapreduce是hadoop的计算框架,我学hadoo ...

  8. python成长笔记

    正则表达式 1.    择一匹配:管道符号(|),表示“从多个模式中选择其一”.例:at|home à at.home 2.    点号匹配除了换行符以外的任何字符 3.    边界匹配:\b匹配一个 ...

  9. win8.1 Dism 应用实例

    使用win8.1安装镜像制作wimboot启动 制作wim启动映像文件 Dism /Export-Image /WIMBoot/SourceImageFile:z:\sources\install.w ...

  10. Struts2框架具体解释

    在Struts2的Model-View-Controller模式实现下面五个核心组件: 动作-Actions 拦截器-Interceptors 值栈/OGNL 结果/结果类型 视图技术 Struts ...