EhCache框架学习记录---入门及简单demo

今天刚刚接触到EhCache框架,感觉很不错,上手比较容易,但是在网上找资料的时候,好多demo太复杂,不适合做入门教程,所以本人特地在下边自己写了一个demo,代码很简单,应该很容易理解的。

关于EhCache框架的介绍,我就不做过多介绍了,百度上关于EhCache的介绍一大堆,我给了一个链接,可以对这个框架有一个大概的认知

EhCache--百度百科

大概了解了这个框架之后,当然就是要动手实践一下,大概有以下这么几个部分:

(1)EhCache框架的使用

(2)Spring+EhCache整合应用

(3)Spring+Hibernate+EhCache整合应用

由于我也是刚刚接触,对之后的几点还不太会,现在先介绍EhCache的基本使用方法,之后的几种应用我会在以后的学习中继续完成。

先说一下EhCache使用的基本流程:

1、MyEclipse新建Java工程

2、添加对应的jar包

3、配置ehcache.xml

4、编写正常的查询方法,之前怎么写,现在还是怎么写,不过在最后要做一些小小的修改

5、测试

整体的流程大概就是这些,我给出我自己的demo,如果有不对的地方,还请大家指出。



ehcache.xml的内容,这个文件默认路径是src/下的,不过也可以更改,位置随意,只需在调用的时候写明即可

<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>
这是对配置文件的属性的解释
name:缓存名称。

maxElementsInMemory:缓存最大个数。

eternal:对象是否永久有效,一但设置了,timeout将不起作用。

timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。

timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。

overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。

diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。

maxElementsOnDisk:硬盘最大缓存个数。 

diskPersistent:是否缓存虚拟机重启期数据。

diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。

memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。

clearOnFlush:内存数量最大时是否清除。


配置好之后,下一步就是写数据库查询的方法了,和之前写的一样,没有差别,代码如下

(本人数据库为MS SQLServer 2005)

这是对数据库连接的一个简单封装,省的总是写一堆重复代码

package com.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

//该类用于封装JDBC的连接以及关闭等操作
public class DbManager {
	//初始化JBDC连接的Connection
	public Connection initDBToConnection() {
		Connection con = null;
		try {
			Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
			con = DriverManager.getConnection(
					"jdbc:sqlserver://localhost:1433;DatabaseName=Test",
					"数据库用户名", "数据库密码");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return con;
	}

	//关闭JDBC连接,无ResultSet对象
	public void closeDB(Statement st, Connection con) {
		try {
			if (st != null) {
				st.close();
			}
			if (con != null) {
				con.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	//关闭JDBC连接,有ResultSet对象
	public void closeDB(ResultSet rs, Statement st, Connection con) {
		try {
			if (rs != null) {
				rs.close();
			}
			if (st != null) {
				st.close();
			}
			if (con != null) {
				con.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

}


这是数据库查询的具体操作,表结构我会稍后给大家

package com.dao;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;

public class Db {

	public List query() throws SQLException {
                //根据之前新建的xml文件来生成CacheManager,来对cache统一管理
                CacheManager manager = CacheManager.create("bin/ehcache.xml");
                //TEST_ID.TEST   这个名字是随便起的,你叫abcd也行,只是一个名字而已
                //因为上边的xml文件没有叫 TEST_ID.TEST的,所以使用了默认配置
                manager.addCache("TEST_ID.TEST");
                Cache cid = manager.getCache("TEST_ID.TEST");
                //这是我刚刚封装的数据库连接的操作
                DbManager dbManager = new DbManager();
                //获取数据库的连接
                Connection con = dbManager.initDBToConnection();
		Statement st = con.createStatement();
		String sql = "select * from TEST";
                //执行sql语句,并返回结果
                ResultSet rs = st.executeQuery(sql);
		List ls = new ArrayList();
		while (rs.next()) {
                        //po类我稍后给大家,po类时对应数据库表的实体类
                        Po po = new Po();
			po.setId(rs.getInt("ID"));
			po.setName(rs.getString("NAME"));
			ls.add(po);
                        //将取出的值封装为po之后再放进缓存中
                        cid.put(new Element(po.getId(), po));
                }
		dbManager.closeDB(rs, st, con);
		return ls;
	}
	
}

po类

一定要注意:要缓存的对象一定要实现Serializable接口

之前我就没有注意到这个,导致我的工程一直报错,死活找不到原因,最后还是google了一下才知道的。

package com.dao;

import java.io.Serializable;

public class Po implements Serializable{
	
	private static final long serialVersionUID = 1L;
	public int id;
	public String name;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

测试类:

package com.main;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;

import com.dao.Db;
import com.dao.Po;

public class Test {

	public static void main(String[] args) throws SQLException {
		Db db = new Db();
		db.query();
		CacheManager manager = CacheManager.create("bin/ehcache.xml");
		Cache cid1 = manager.getCache("TEST_ID.TEST");
                //这个1指的是缓存的key部分,因为缓存是以key-value的形式存储的,这里去key为1的value值(前提是你的缓存中有这个值,具体情况要做改动)
                Element e = cid1.get(1);
		Po p = (Po) e.getObjectValue();
		System.out.println(p.getName());
	}

}

最后,能在控制台输出结果:

q(这是我数据库的数据)


这是我的表结构,很简单,只有两个字段



以上有错误的地方,欢迎大家给我指正,ehcache框架的其他应用部分,在我学习之后会第一时间分享的。










  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值