今天刚刚接触到EhCache框架,感觉很不错,上手比较容易,但是在网上找资料的时候,好多demo太复杂,不适合做入门教程,所以本人特地在下边自己写了一个demo,代码很简单,应该很容易理解的。
关于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框架的其他应用部分,在我学习之后会第一时间分享的。