- 浏览: 107631 次
- 性别:
- 来自: 北京
最新评论
-
oaklet:
最新改进型
# coding:gbk
import sys
...
密码生成小工具 -
西斧头帮老大-_-:
楼主,那个我写了个例子
Map<String,Strin ...
EHCache简单使用 -
hopana:
发一下源代码吧,想学习一下
EHCache简单使用 -
menghuannvxia:
谢谢,学习了
EHCache简单使用 -
wtaisi:
非常好。。。。
EHCache简单使用
关于缓存的话题,在坛子里已经有很多讨论,简单的来说,如果一个应用中80% 的时间内都在访问20% 的数据,那么,这时候就应该使用缓存了。
测试环境:
MySQL 5.0.22,
jdk1.6.0_07,
ehcache-1.6.0-beta2,
mysql-connector-java-3.1.14
测试表:
支持类:
插入测试数据:
使用的javaBean:
先试一下缓存到字典中:
缓存到字典中,写法比较简单,使用方便,缺点就是缓存数据量比较少,一般缓存10W就有可能把jvm的缓存给占完了。用ehcache就可以解决缓存数据太少的问题。
一个简单的配置:
Cache配置中的几个属性:
name:Cache的名称,必须是唯一的(ehcache会把这个cache放到HashMap里)。
maxElementsInMemory:内存中保持的对象数量。
maxElementsOnDisk:DiskStore中保持的对象数量,默认值为0,表示不限制。
eternal:是否是永恒数据,如果是,则它的超时设置会被忽略。
overflowToDisk:如果内存中数据数量超过maxElementsInMemory限制,是否要缓存到磁盘上。
timeToIdleSeconds:对象空闲时间,指对象在多长时间没有被访问就会失效。只对eternal为false的有效。默认值0,表示一直可以访问。
timeToLiveSeconds:对象存活时间,指对象从创建到失效所需要的时间。只对eternal为false的有效。默认值0,表示一直可以访问。
diskPersistent:是否在磁盘上持久化。指重启jvm后,数据是否有效。默认为false。
diskExpiryThreadIntervalSeconds:对象检测线程运行时间间隔。标识对象状态的线程多长时间运行一次。
diskSpoolBufferSizeMB:DiskStore使用的磁盘大小,默认值30MB。每个cache使用各自的DiskStore。
memoryStoreEvictionPolicy:如果内存中数据超过内存限制,向磁盘缓存时的策略。默认值LRU,可选FIFO、LFU。
获取配置中的demoCache:
往cache中加入数据:
这里在CacheManager中直接加入了一个叫TEST_ID.TEST的cache。因为只给了一个名字,所以系统会把defaultCache的设置给它clone一份。
使用方法,像字典一样使用就行:
ehcache中数据是以java对象的形式存在的,使用了java的序列化保存到磁盘,所以保存的对象要实现Serializable接口。ehcache还可以支持分布式缓存。
测试环境:
MySQL 5.0.22,
jdk1.6.0_07,
ehcache-1.6.0-beta2,
mysql-connector-java-3.1.14
测试表:
CREATE TABLE TEST ( TEST_ID BIGINT, TEST_NAME VARCHAR(50), TEST_TIME TIMESTAMP, TEST_VALUE DECIMAL(10, 3) );
支持类:
public class Util { public static Random rand = new Random(); public static String atoz = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; public static String genString(int length) { StringBuilder re = new StringBuilder(length); re.append(atoz.charAt(rand.nextInt(52))); for (int i = 0; i < length; i++) { re.append(atoz.charAt(rand.nextInt(62))); } return re.toString(); } public static double genDouble() { double d1 = 5120 * rand.nextDouble(); double d2 = 1024000 * rand.nextDouble(); return d1 + d2; } }
插入测试数据:
public static void traditionalInsert(int total) throws Exception { Thread.sleep(3000); Timestamp current = new Timestamp(System.currentTimeMillis()); String currentStr = dateFormat.format(current); System.out.println(currentStr); Connection conn = DriverManager.getConnection(dbURL, user, pass); try { long begin = System.currentTimeMillis(); conn.setAutoCommit(false); String sql = "INSERT INTO TEST (TEST_ID,TEST_NAME,TEST_TIME,TEST_VALUE) VALUES (?, ?, ?, ?)"; PreparedStatement ps = conn.prepareStatement(sql); for (int i = 1; i <= total; i++) { ps.setLong(1, i); ps.setString(2, Util.genString(33)); ps.setTimestamp(3, current); ps.setBigDecimal(4, new BigDecimal(Util.genDouble())); ps.addBatch(); if ((i % 500) == 0) { ps.executeBatch(); } } ps.executeBatch(); conn.commit(); long end = System.currentTimeMillis(); System.out.printf("Count:%d Time:%d\n", total, (end - begin)); } catch (Exception ex) { ex.printStackTrace(); conn.rollback(); } finally { conn.close(); } }
使用的javaBean:
public class TEST implements Serializable { private static final long serialVersionUID = 1L; public Long TEST_ID; public String TEST_NAME; public Timestamp TEST_TIME; public BigDecimal TEST_VALUE; @Override public String toString() { return String.format("ID:%s,,,NAME:%s", TEST_ID, TEST_NAME); } }
先试一下缓存到字典中:
public static HashMap<Long, TEST> simpleCache() throws Exception { HashMap<Long, TEST> cacheid = new HashMap<Long, TEST>(); Class.forName(dbDriver); Connection conn = DriverManager.getConnection(dbURL, user, pass); try { long begin = System.currentTimeMillis(); Statement s = conn.createStatement(); String sql = "SELECT TEST_ID,TEST_NAME,TEST_TIME,TEST_VALUE FROM TEST"; ResultSet querySet = s.executeQuery(sql); for (int i = 1; querySet.next(); i++) { TEST curr = new TEST(); curr.TEST_ID = querySet.getLong(1); curr.TEST_NAME = querySet.getString(2); curr.TEST_TIME = querySet.getTimestamp(3); curr.TEST_VALUE = querySet.getBigDecimal(4); cacheid.put(curr.TEST_ID, curr); } long end = System.currentTimeMillis(); System.out.printf("Time:%d\n", (end - begin)); } catch (Exception ex) { ex.printStackTrace(); } finally { conn.close(); } return cacheid; }
缓存到字典中,写法比较简单,使用方便,缺点就是缓存数据量比较少,一般缓存10W就有可能把jvm的缓存给占完了。用ehcache就可以解决缓存数据太少的问题。
一个简单的配置:
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd"> <diskStore path="java.io.tmpdir"/> <defaultCache maxElementsInMemory="10000" maxElementsOnDisk="0" eternal="true" overflowToDisk="true" diskPersistent="false" timeToIdleSeconds="0" timeToLiveSeconds="0" diskSpoolBufferSizeMB="50" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LFU" /> <cache name="demoCache" maxElementsInMemory="100" maxElementsOnDisk="0" eternal="false" overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="119" timeToLiveSeconds="119" diskSpoolBufferSizeMB="50" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="FIFO" /> </ehcache>
Cache配置中的几个属性:
name:Cache的名称,必须是唯一的(ehcache会把这个cache放到HashMap里)。
maxElementsInMemory:内存中保持的对象数量。
maxElementsOnDisk:DiskStore中保持的对象数量,默认值为0,表示不限制。
eternal:是否是永恒数据,如果是,则它的超时设置会被忽略。
overflowToDisk:如果内存中数据数量超过maxElementsInMemory限制,是否要缓存到磁盘上。
timeToIdleSeconds:对象空闲时间,指对象在多长时间没有被访问就会失效。只对eternal为false的有效。默认值0,表示一直可以访问。
timeToLiveSeconds:对象存活时间,指对象从创建到失效所需要的时间。只对eternal为false的有效。默认值0,表示一直可以访问。
diskPersistent:是否在磁盘上持久化。指重启jvm后,数据是否有效。默认为false。
diskExpiryThreadIntervalSeconds:对象检测线程运行时间间隔。标识对象状态的线程多长时间运行一次。
diskSpoolBufferSizeMB:DiskStore使用的磁盘大小,默认值30MB。每个cache使用各自的DiskStore。
memoryStoreEvictionPolicy:如果内存中数据超过内存限制,向磁盘缓存时的策略。默认值LRU,可选FIFO、LFU。
获取配置中的demoCache:
CacheManager manager = CacheManager.create("ehcache.xml"); Cache demo = manager.getCache("demoCache");
往cache中加入数据:
public static void ehcache() throws Exception { CacheManager manager = CacheManager.create("ehcache.xml"); manager.addCache("TEST_ID.TEST"); Cache cid = manager.getCache("TEST_ID.TEST"); Class.forName(dbDriver); Connection conn = DriverManager.getConnection(dbURL, user, pass); try { long begin = System.currentTimeMillis(); Statement s = conn.createStatement(); String sql = "SELECT TEST_ID,TEST_NAME,TEST_TIME,TEST_VALUE FROM TEST"; ResultSet querySet = s.executeQuery(sql); for (int i = 1; querySet.next(); i++) { TEST curr = new TEST(); curr.TEST_ID = querySet.getLong(1); curr.TEST_NAME = querySet.getString(2); curr.TEST_TIME = querySet.getTimestamp(3); curr.TEST_VALUE = querySet.getBigDecimal(4); cid.put(new Element(curr.TEST_ID, curr)); } long end = System.currentTimeMillis(); System.out.printf("Time:%d\n", (end - begin)); } catch (Exception ex) { ex.printStackTrace(); } finally { conn.close(); } }
这里在CacheManager中直接加入了一个叫TEST_ID.TEST的cache。因为只给了一个名字,所以系统会把defaultCache的设置给它clone一份。
使用方法,像字典一样使用就行:
Cache cid = manager.getCache("TEST_ID.TEST"); Element e5120 = cid.get(new Long(5120)); System.out.println(e5120.getValue());
ehcache中数据是以java对象的形式存在的,使用了java的序列化保存到磁盘,所以保存的对象要实现Serializable接口。ehcache还可以支持分布式缓存。
评论
7 楼
西斧头帮老大-_-
2016-02-03
楼主,那个我写了个例子
Map<String,String> map= getDicEntry(line);
if(null!=map){
cid.put(new Element(dicNo,map));
}
ehcache里面保存的是map,但是启动服务的时候有时候能取到值,有时候报空指针(关掉服务重启),请问是啥情况?
ehcache.xml配置如下:
<diskStore path="java.io.tmpdir" /> <!-- 缓存存放目录(此目录为放入系统默认缓存目录),也可以是”D:/cache“ java.io.tmpdir -->
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
maxElementsOnDisk="10000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>
求楼主解答,谢谢了
Map<String,String> map= getDicEntry(line);
if(null!=map){
cid.put(new Element(dicNo,map));
}
ehcache里面保存的是map,但是启动服务的时候有时候能取到值,有时候报空指针(关掉服务重启),请问是啥情况?
ehcache.xml配置如下:
<diskStore path="java.io.tmpdir" /> <!-- 缓存存放目录(此目录为放入系统默认缓存目录),也可以是”D:/cache“ java.io.tmpdir -->
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
maxElementsOnDisk="10000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>
求楼主解答,谢谢了
6 楼
hopana
2015-08-10
发一下源代码吧,想学习一下
5 楼
menghuannvxia
2015-08-04
谢谢,学习了
4 楼
wtaisi
2015-07-29
非常好。。。。
3 楼
lhs295988029
2015-01-21
条理清楚,还是可以的,多谢~
2 楼
liu517139239
2014-11-13
学习了 。
1 楼
路边风景
2011-03-31
感谢楼主清晰的解答。学习了。
发表评论
-
Java动态编译笔记
2012-12-28 19:11 3910import java.io.File; import ... -
XML Schema 简述
2009-06-16 17:44 1610简介 XML Schema 是 W3C 标准。 XML Sch ... -
JAXB的简单使用
2009-06-16 16:41 2893环境: jdk1.6.0_07 JavaTM Architec ... -
iBatis的简单使用
2009-06-15 16:35 2516简介 使用 SQL Map,能够大大减少访问关系数据库的代码 ... -
面向对象的原理
2009-06-10 16:17 2917开放封闭原理(Open Closed Principle) 类 ... -
重构学习笔记
2009-03-19 22:48 1152引子 过度设计,是指代 ... -
操作String的几个Method
2009-02-09 14:08 3568public static String join ... -
使用Jakarta-ORO库的几个例子
2008-08-26 19:14 13863简介 Jakarta-ORO是最全面以及优化得最好的正 ... -
Oracle入库速度测试(Java版)
2008-08-26 19:08 2825测试环境: Intel Xeon 2.4G四核心 2. ... -
使用IReport制作JasperReport报表
2007-08-31 19:08 2628JasperReport是一个报表生成工具,用户须按照它编写的 ... -
使用XMLBeans简化XML操作
2007-08-31 18:56 1895环境: jdk1.5.0_12 xmlbeans- ... -
Spring一瞥
2007-07-29 10:39 1245Spring的特色: The Inv ... -
Struts来龙去脉
2007-07-29 08:49 1533Struts的特色: 使用框架的好处是,你将从别人已经付诸 ...
相关推荐
springmvc+ehcache简单例子,一看就懂
EHCache是来自sourceforge(http://ehcache.sourceforge.net/)的开源项目,也是纯Java实现的简单、快速的Cache组件。EHCache支持内存和磁盘的缓存,支持LRU、LFU和FIFO多种淘汰算法,支持分布式的Cache,可以作为...
简单介绍Ehcache的优缺点
EHCache API的基本用法 主要提供了一些EHCache简单的方法封装。
Ehcache 是一种广泛使用的开源 Java 分布式缓存。主要面向通用缓存,Java EE 和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个 gzip 缓存 servlet 过滤器,支持 REST 和 SOAP api...
Ehcache 的一个简单demo案例 了解如何使用ehcache 以及掌握一些基本的api
ehcache简单总结
NULL 博文链接:https://nassir.iteye.com/blog/1604595
spring整合EhCache 的简单例子
spring整合EhCache 简单例子
简单的ehcache缓存demo实例,描述了 ehcache缓存的简单使用
ehcache是一个用Java实现的使用简单,高速,实现线程安全的缓存管理类库,ehcache提供了用内存,磁盘文件存储,以及分布式存储方式等多种灵活的cache管理方案,是hibernate中默认的CacheProvider。
需要使用Spring来实现一个Cache简单的解决方案,具体需求如下:使用任意一个现有开源Cache Framework,要求可以Cache系统中Service或则DAO层的get/find等方法返回结果,如果数据更新(使用Create/update/delete方法...
【EhCache】Java缓存框架使用EhCache结合Spring AOP EhCache是一个纯Java的进程内缓存框架,具有如下特点: 1. 快速简单,非常容易和应用集成。 2.支持多种缓存策略 。 3. 缓存数据有两级:内存和磁盘,因此无需...
主要是springmvc和mybatis整合ehcache,以及ExtJs简单的分页!
springboot2.0使用ehcache缓存,这个压缩包时一个简单的demo。
ehcache是一套比较成熟的缓存解决方案,很多主流框架如spring、hibernate都有很好的支持。Ehcache支持集群环境,API比较简单,上手容易
简单.3. 多种缓存策略4. 缓存数据有两级:内存和磁盘,因此无需担心容量问题5. 缓存数据会在虚拟机重启的过程中写入磁盘6. 可以通过RMI、可插入API等方式进行分布式缓存7. 具有缓存和缓存管理器的侦听接口8. 支持多...
EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。主要的特性有:1. 快速.2. 简单.3. 多种缓存策略4. 缓存数据有两级:内存和磁盘,因此无需担心容量问题5. 缓存...