`

EHCache简单使用

    博客分类:
  • java
 
阅读更多
EHCache简单使用 博客分类: java
转载:http://voyageivi.iteye.com/blog/1484715 感谢分享。
SQLCacheMySQLJVMXML .
关于缓存的话题,在坛子里已经有很多讨论,简单的来说,如果一个应用中80% 的时间内都在访问20% 的数据,那么,这时候就应该使用缓存了。
测试环境:
MySQL 5.0.22,
jdk1.6.0_07,
ehcache-1.6.0-beta2,
mysql-connector-java-3.1.14

测试表:
Sql代码 
1.CREATE TABLE TEST  
2.(  
3.TEST_ID BIGINT,  
4.TEST_NAME VARCHAR(50),  
5.TEST_TIME TIMESTAMP,  
6.TEST_VALUE DECIMAL(10, 3)  
7.); 
CREATE TABLE TEST
(
TEST_ID BIGINT,
TEST_NAME VARCHAR(50),
TEST_TIME TIMESTAMP,
TEST_VALUE DECIMAL(10, 3)
);
支持类:

Java代码 
1.public class Util {  
2. 
3.    public static Random rand = new Random();  
4.    public static String atoz = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";  
5. 
6.    public static String genString(int length) {  
7.        StringBuilder re = new StringBuilder(length);  
8.        re.append(atoz.charAt(rand.nextInt(52)));  
9.        for (int i = 0; i < length; i++) {  
10.            re.append(atoz.charAt(rand.nextInt(62)));  
11.        }  
12.        return re.toString();  
13.    }  
14. 
15.    public static double genDouble() {  
16.        double d1 = 5120 * rand.nextDouble();  
17.        double d2 = 1024000 * rand.nextDouble();  
18.        return d1 + d2;  
19.    }  
20.} 
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;
    }
}
插入测试数据:

Java代码 
1.public static void traditionalInsert(int total) throws Exception {  
2.        Thread.sleep(3000);  
3.        Timestamp current = new Timestamp(System.currentTimeMillis());  
4.        String currentStr = dateFormat.format(current);  
5.        System.out.println(currentStr);  
6.        Connection conn = DriverManager.getConnection(dbURL, user, pass);  
7.        try {  
8.            long begin = System.currentTimeMillis();  
9.            conn.setAutoCommit(false);  
10.            String sql = "INSERT INTO TEST (TEST_ID,TEST_NAME,TEST_TIME,TEST_VALUE) VALUES (?, ?, ?, ?)";  
11.            PreparedStatement ps = conn.prepareStatement(sql);  
12.            for (int i = 1; i <= total; i++) {  
13.                ps.setLong(1, i);  
14.                ps.setString(2, Util.genString(33));  
15.                ps.setTimestamp(3, current);  
16.                ps.setBigDecimal(4, new BigDecimal(Util.genDouble()));  
17.                ps.addBatch();  
18.                if ((i % 500) == 0) {  
19.                    ps.executeBatch();  
20.                }  
21.            }  
22.            ps.executeBatch();  
23.            conn.commit();  
24.            long end = System.currentTimeMillis();  
25.            System.out.printf("Count:%d Time:%d\n", total, (end - begin));  
26.        } catch (Exception ex) {  
27.            ex.printStackTrace();  
28.            conn.rollback();  
29.        } finally {  
30.            conn.close();  
31.        }  
32.    } 
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:

Java代码 
1.public class TEST implements Serializable {  
2.    private static final long serialVersionUID = 1L;  
3.    public Long TEST_ID;  
4.    public String TEST_NAME;  
5.    public Timestamp TEST_TIME;  
6.    public BigDecimal TEST_VALUE;  
7.    @Override 
8.    public String toString() {  
9.        return String.format("ID:%s,,,NAME:%s", TEST_ID, TEST_NAME);  
10.    }  
11.} 
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);
}
}
先试一下缓存到字典中:

Java代码 
1.public static HashMap<Long, TEST> simpleCache() throws Exception {  
2.        HashMap<Long, TEST> cacheid = new HashMap<Long, TEST>();  
3.        Class.forName(dbDriver);  
4.        Connection conn = DriverManager.getConnection(dbURL, user, pass);  
5.        try {  
6.            long begin = System.currentTimeMillis();  
7.            Statement s = conn.createStatement();  
8.            String sql = "SELECT TEST_ID,TEST_NAME,TEST_TIME,TEST_VALUE FROM TEST";  
9.            ResultSet querySet = s.executeQuery(sql);  
10.            for (int i = 1; querySet.next(); i++) {  
11.                TEST curr = new TEST();  
12.                curr.TEST_ID = querySet.getLong(1);  
13.                curr.TEST_NAME = querySet.getString(2);  
14.                curr.TEST_TIME = querySet.getTimestamp(3);  
15.                curr.TEST_VALUE = querySet.getBigDecimal(4);  
16.                cacheid.put(curr.TEST_ID, curr);  
17.            }  
18.            long end = System.currentTimeMillis();  
19.            System.out.printf("Time:%d\n", (end - begin));  
20.        } catch (Exception ex) {  
21.            ex.printStackTrace();  
22.        } finally {  
23.            conn.close();  
24.        }  
25.        return cacheid;  
26.    } 
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就可以解决缓存数据太少的问题。

一个简单的配置:

Xml代码 
1.<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
2.   xsi:noNamespaceSchemaLocation="ehcache.xsd"> 
3.  <diskStore path="java.io.tmpdir"/> 
4.  <defaultCache 
5.    maxElementsInMemory="10000" 
6.    maxElementsOnDisk="0" 
7.    eternal="true" 
8.    overflowToDisk="true" 
9.    diskPersistent="false" 
10.    timeToIdleSeconds="0" 
11.    timeToLiveSeconds="0" 
12.    diskSpoolBufferSizeMB="50" 
13.    diskExpiryThreadIntervalSeconds="120" 
14.    memoryStoreEvictionPolicy="LFU" 
15.    /> 
16.  <cache name="demoCache" 
17.    maxElementsInMemory="100" 
18.    maxElementsOnDisk="0" 
19.    eternal="false" 
20.    overflowToDisk="false" 
21.    diskPersistent="false" 
22.    timeToIdleSeconds="119" 
23.    timeToLiveSeconds="119" 
24.    diskSpoolBufferSizeMB="50" 
25.    diskExpiryThreadIntervalSeconds="120" 
26.    memoryStoreEvictionPolicy="FIFO" 
27.    /> 
28.</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:

Java代码 
1.CacheManager manager = CacheManager.create("ehcache.xml");  
2.Cache demo = manager.getCache("demoCache"); 
CacheManager manager = CacheManager.create("ehcache.xml");
Cache demo = manager.getCache("demoCache");
往cache中加入数据:

Java代码 
1.public static void ehcache() throws Exception {  
2.        CacheManager manager = CacheManager.create("ehcache.xml");  
3.        manager.addCache("TEST_ID.TEST");  
4.        Cache cid = manager.getCache("TEST_ID.TEST");  
5.        Class.forName(dbDriver);  
6.        Connection conn = DriverManager.getConnection(dbURL, user, pass);  
7.        try {  
8.            long begin = System.currentTimeMillis();  
9.            Statement s = conn.createStatement();  
10.            String sql = "SELECT TEST_ID,TEST_NAME,TEST_TIME,TEST_VALUE FROM TEST";  
11.            ResultSet querySet = s.executeQuery(sql);  
12.            for (int i = 1; querySet.next(); i++) {  
13.                TEST curr = new TEST();  
14.                curr.TEST_ID = querySet.getLong(1);  
15.                curr.TEST_NAME = querySet.getString(2);  
16.                curr.TEST_TIME = querySet.getTimestamp(3);  
17.                curr.TEST_VALUE = querySet.getBigDecimal(4);  
18.                cid.put(new Element(curr.TEST_ID, curr));  
19.            }  
20.            long end = System.currentTimeMillis();  
21.            System.out.printf("Time:%d\n", (end - begin));  
22.        } catch (Exception ex) {  
23.            ex.printStackTrace();  
24.        } finally {  
25.            conn.close();  
26.        }  
27.    } 
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一份。
使用方法,像字典一样使用就行:

Java代码 
1.Cache cid = manager.getCache("TEST_ID.TEST");  
2.Element e5120 = cid.get(new Long(5120));  
3.System.out.println(e5120.getValue()); 
Cache cid = manager.getCache("TEST_ID.TEST");
Element e5120 = cid.get(new Long(5120));
System.out.println(e5120.getValue());

ehcache中数据是以java对象的形式存在的,使用了java的序列化保存到磁盘,所以保存的对象要实现Serializable接口。ehcache还可以支持分布式缓存。
分享到:
评论

相关推荐

    springmvc+ehcache简单例子

    springmvc+ehcache简单例子,一看就懂

    EHCache的使用

    EHCache是来自sourceforge(http://ehcache.sourceforge.net/)的开源项目,也是纯Java实现的简单、快速的Cache组件。EHCache支持内存和磁盘的缓存,支持LRU、LFU和FIFO多种淘汰算法,支持分布式的Cache,可以作为...

    简单介绍Ehcache的优缺点

    简单介绍Ehcache的优缺点

    EHCache API的基本用法

    EHCache API的基本用法 主要提供了一些EHCache简单的方法封装。

    Ehcache分布式缓存与其在SpringBoot应用

    Ehcache 是一种广泛使用的开源 Java 分布式缓存。主要面向通用缓存,Java EE 和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个 gzip 缓存 servlet 过滤器,支持 REST 和 SOAP api...

    Ehcache_Hello

    Ehcache 的一个简单demo案例 了解如何使用ehcache 以及掌握一些基本的api

    ehcache原理总结

    ehcache简单总结

    Ehcache 简单的监控

    NULL 博文链接:https://nassir.iteye.com/blog/1604595

    spring整合EhCache 的简单例子

    spring整合EhCache 的简单例子

    spring整合EhCache 简单例子

    spring整合EhCache 简单例子

    ehcache缓存demo

    简单的ehcache缓存demo实例,描述了 ehcache缓存的简单使用

    EHCache缓存

    ehcache是一个用Java实现的使用简单,高速,实现线程安全的缓存管理类库,ehcache提供了用内存,磁盘文件存储,以及分布式存储方式等多种灵活的cache管理方案,是hibernate中默认的CacheProvider。

    Spring AOP+ehCache简单缓存系统解决方案

    需要使用Spring来实现一个Cache简单的解决方案,具体需求如下:使用任意一个现有开源Cache Framework,要求可以Cache系统中Service或则DAO层的get/find等方法返回结果,如果数据更新(使用Create/update/delete方法...

    EhCache缓存技术

    【EhCache】Java缓存框架使用EhCache结合Spring AOP EhCache是一个纯Java的进程内缓存框架,具有如下特点: 1. 快速简单,非常容易和应用集成。 2.支持多种缓存策略 。 3. 缓存数据有两级:内存和磁盘,因此无需...

    SpringMvc+MyBatis+ehcache+ExtJs分页

    主要是springmvc和mybatis整合ehcache,以及ExtJs简单的分页!

    springboot2使用ehcache缓存

    springboot2.0使用ehcache缓存,这个压缩包时一个简单的demo。

    ehcache-1.2.jar

    ehcache是一套比较成熟的缓存解决方案,很多主流框架如spring、hibernate都有很好的支持。Ehcache支持集群环境,API比较简单,上手容易

    Java缓存框架 Ehcache.zip

    简单.3. 多种缓存策略4. 缓存数据有两级:内存和磁盘,因此无需担心容量问题5. 缓存数据会在虚拟机重启的过程中写入磁盘6. 可以通过RMI、可插入API等方式进行分布式缓存7. 具有缓存和缓存管理器的侦听接口8. 支持多...

    Ehcache Java 缓存框架 v3.6.1

    EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。主要的特性有:1. 快速.2. 简单.3. 多种缓存策略4. 缓存数据有两级:内存和磁盘,因此无需担心容量问题5. 缓存...

Global site tag (gtag.js) - Google Analytics