`
QiuQiu0034
  • 浏览: 122505 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

Mybatis入门实例(二)——添加ehcache缓存支持

阅读更多

接上回: Mybatis入门实例(一),地址http://qiuqiu0034.iteye.com/blog/1157768 

本帖用的数据库和上面帖子中的数据库相同

 

为了提高MyBatis的性能,有时候我们需要加入缓存支持,目前用的比较多的缓存莫过于ehcache缓存了,ehcache性能强大,而且位各种应用都提供了解决方案,在此我们主要是做查询缓存,提高查询的效率.

 

在Mybatis的官网上把集成ehcache的文档下载下来看了看,说的太简单了,对于新手很难理解,而且里面说的也不是很清楚,经过一番折腾,终于将ehcache加入了.

 

官网上提供了一个MyBatis-ehcache.jar的包用于整合ehcache缓存,文档中还说明需要一个ehcache-core.jar的包,除了这两个包之外有几个包也是必须的,官方并没有说明,以下是需要加入的所有和ehcache相关的包:

1.ehcache-core-2.4.4.jar

2.mybatis-ehcache-1.0.0.jar

3.slf4j-api-1.6.1.jar

4.slf4j-log4j12-1.6.2.jar

 

除此之外还有mybatis的jar包,log4j,mysql驱动,这些大家应该都知道.

 

将上述包加入项目之后,新建一个文件名,该文件名必须为ehcache.xml,放在类路径下面,内容如下

 

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="../bin/ehcache.xsd">
	<!--
	name:Cache的唯一标识
	maxElementsInMemory:内存中最大缓存对象数
	maxElementsOnDisk:磁盘中最大缓存对象数,若是0表示无穷大
	eternal:Element是否永久有效,一但设置了,timeout将不起作用
	overflowToDisk:配置此属性,当内存中Element数量达到maxElementsInMemory时,Ehcache将会Element写到磁盘中
	timeToIdleSeconds:设置Element在失效前的允许闲置时间。仅当element不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大
	timeToLiveSeconds:设置Element在失效前允许存活时间。最大时间介于创建时间和失效时间之间。仅当element不是永久有效时使用,默认是0.,也就是element存活时间无穷大 
	diskPersistent:是否缓存虚拟机重启期数据
	diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒
	diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区
	 memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用) 
	-->
	<defaultCache overflowToDisk="true" eternal="false"/>
	<diskStore path="D:/cache" />
	<!--
		<cache name="zzugxy" overflowToDisk="true" eternal="false"
		timeToIdleSeconds="300" timeToLiveSeconds="600" maxElementsInMemory="1000"
		maxElementsOnDisk="10" diskPersistent="true" diskExpiryThreadIntervalSeconds="300"
		diskSpoolBufferSizeMB="100" memoryStoreEvictionPolicy="LRU" />
	-->
</ehcache>

 

该文件是ehcache的配置文件,上面的注释已经说得很清楚了,这里我用的是默认的配置

至此ehcache已经配置好了,然后只需要在你想要缓存的mapper配置文件里面加入以下内容,该查询语句得到的结果将会被缓存

 

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qiuqiu.dao.PersonDao">
	<!-- 以下两个<cache>标签二选一,第一个可以输出日志,第二个不输出日志 -->
	<cache type="org.mybatis.caches.ehcache.LoggingEhcache"/>
	<!-- <cache type="org.mybatis.caches.ehcache.EhcacheCache"/> -->
	
	<select id="selectUserById" parameterType="int" resultType="org.qiuqiu.vo.Person">
		select * from person where id=#{id} 
	</select>
</mapper>
 

这样就对这个mapper里面的各种结果进行了缓存.程序中不需要修改任何地方.

 

这个过程不复杂,也没什么难度,不过Mybatis的官方说的也太含糊了.附件下面有,需要的各种jar包已经包含.

分享到:
评论
9 楼 GONETHEN 2016-11-02  
怎样验证缓存成功?出现“Cache Hit Ratio [com.xxx.dao.TopicDao]: 0.25”证明成功了?




还有,他是如何实现判断缓存是否是最新,获取缓存还是获取数据库数据如何控制?mybatis-ehcache.jar做到的吗?
8 楼 dexuter 2014-06-23  
mikezdz 写道
缓存是用上了,不过这个例子表现的不够明显,我增加了几行重复查询和输出,效果应该就可以看出来了:
public class Test {

	public static void main(String[] args) {
		SqlSessionFactory factory = null;
		try {
			factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("Configuration.xml"));
		} catch (IOException e) {
			e.printStackTrace();
		}
		SqlSession sqlSession = factory.openSession();
		Person p = (Person) sqlSession.selectOne("com.qiuqiu.dao.PersonDao.selectUserById", 5);
		Person p1 = (Person) sqlSession.selectOne("com.qiuqiu.dao.PersonDao.selectUserById", 5);
		Person p2 = (Person) sqlSession.selectOne("com.qiuqiu.dao.PersonDao.selectUserById", 5);
		Person p3 = (Person) sqlSession.selectOne("com.qiuqiu.dao.PersonDao.selectUserById", 5);
		System.out.println("p:" + p.getName());
		System.out.println("p1:" + p1.getName());
		System.out.println("p2:" + p2.getName());
		System.out.println("p3:" + p3.getName());
		Person p4 = (Person) sqlSession.selectOne("com.qiuqiu.dao.PersonDao.selectUserById", 6);
		Person p5 = (Person) sqlSession.selectOne("com.qiuqiu.dao.PersonDao.selectUserById", 6);
		Person p6 = (Person) sqlSession.selectOne("com.qiuqiu.dao.PersonDao.selectUserById", 6);
		System.out.println("p4:" + p4.getName());
		System.out.println("p5:" + p5.getName());
		System.out.println("p6:" + p6.getName());

		Person p0 = (Person) sqlSession.selectOne("com.qiuqiu.dao.PersonDao.selectUserById", 5);
		Person p10 = (Person) sqlSession.selectOne("com.qiuqiu.dao.PersonDao.selectUserById", 5);
		Person p20 = (Person) sqlSession.selectOne("com.qiuqiu.dao.PersonDao.selectUserById", 5);
		Person p30 = (Person) sqlSession.selectOne("com.qiuqiu.dao.PersonDao.selectUserById", 5);
		System.out.println("p0:" + p0.getName());
		System.out.println("p10:" + p10.getName());
		System.out.println("p20:" + p20.getName());
		System.out.println("p30:" + p30.getName());
	}

}


你这个根本没用上ehcache的二级缓存吧,你这个用的session的一级缓存,mybatis一级缓存是默认开启的
7 楼 mikezdz 2013-08-15  
缓存是用上了,不过这个例子表现的不够明显,我增加了几行重复查询和输出,效果应该就可以看出来了:
public class Test {

	public static void main(String[] args) {
		SqlSessionFactory factory = null;
		try {
			factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("Configuration.xml"));
		} catch (IOException e) {
			e.printStackTrace();
		}
		SqlSession sqlSession = factory.openSession();
		Person p = (Person) sqlSession.selectOne("com.qiuqiu.dao.PersonDao.selectUserById", 5);
		Person p1 = (Person) sqlSession.selectOne("com.qiuqiu.dao.PersonDao.selectUserById", 5);
		Person p2 = (Person) sqlSession.selectOne("com.qiuqiu.dao.PersonDao.selectUserById", 5);
		Person p3 = (Person) sqlSession.selectOne("com.qiuqiu.dao.PersonDao.selectUserById", 5);
		System.out.println("p:" + p.getName());
		System.out.println("p1:" + p1.getName());
		System.out.println("p2:" + p2.getName());
		System.out.println("p3:" + p3.getName());
		Person p4 = (Person) sqlSession.selectOne("com.qiuqiu.dao.PersonDao.selectUserById", 6);
		Person p5 = (Person) sqlSession.selectOne("com.qiuqiu.dao.PersonDao.selectUserById", 6);
		Person p6 = (Person) sqlSession.selectOne("com.qiuqiu.dao.PersonDao.selectUserById", 6);
		System.out.println("p4:" + p4.getName());
		System.out.println("p5:" + p5.getName());
		System.out.println("p6:" + p6.getName());

		Person p0 = (Person) sqlSession.selectOne("com.qiuqiu.dao.PersonDao.selectUserById", 5);
		Person p10 = (Person) sqlSession.selectOne("com.qiuqiu.dao.PersonDao.selectUserById", 5);
		Person p20 = (Person) sqlSession.selectOne("com.qiuqiu.dao.PersonDao.selectUserById", 5);
		Person p30 = (Person) sqlSession.selectOne("com.qiuqiu.dao.PersonDao.selectUserById", 5);
		System.out.println("p0:" + p0.getName());
		System.out.println("p10:" + p10.getName());
		System.out.println("p20:" + p20.getName());
		System.out.println("p30:" + p30.getName());
	}

}

6 楼 xiaoxiaoming 2013-08-01  
感觉缓存没用上啊,,大家知道是怎么回事吗
5 楼 瑞木浩轩 2013-06-08  
digdata 写道
请问博主,我下载了您的实例后,运行时确不能命中缓存.
Cache Hit Ratio [com.qiuqiu.dao.PersonDao]: 0.0
多次执行都是命中率为0?

不知道您在测试的过程中是否也遇到?!


他的这个问题 不知道你搞定了没有!? 求教
4 楼 QiuQiu0034 2012-11-14  
digdata 写道
请问博主,我下载了您的实例后,运行时确不能命中缓存.
Cache Hit Ratio [com.qiuqiu.dao.PersonDao]: 0.0
多次执行都是命中率为0?

不知道您在测试的过程中是否也遇到?!

惭愧,这个我还真没有i仔细研究过,当时只是简单的配了起来可以运行
你不妨去Google Code上面看看源代码
3 楼 digdata 2012-11-13  
请问博主,我下载了您的实例后,运行时确不能命中缓存.
Cache Hit Ratio [com.qiuqiu.dao.PersonDao]: 0.0
多次执行都是命中率为0?

不知道您在测试的过程中是否也遇到?!
2 楼 manna_MM 2012-08-06  
好例子
1 楼 qqzhijun 2012-02-24  
谢啦,挺好的例子

相关推荐

    springMVC+mybatis+ehcache整合

    SpringMVC、MyBatis和Ehcache的整合提供了一种优秀的解决方案,这三种技术分别处理了不同的层面:SpringMVC作为MVC框架负责控制层,MyBatis作为持久层框架简化了数据库操作,而Ehcache则作为缓存系统提高了数据访问...

    SpringMVC+Mybatis+Spring+Shiro+ehcache整合配置文件

    最后,通过Spring的AOP支持,将Shiro的拦截器添加到Spring的全局拦截器链中,实现安全控制。 这样的整合可以创建一个健壮、高效的Web应用,具备良好的架构设计,易于扩展和维护。开发者可以专注于业务逻辑,而不用...

    Ehcache缓存技术

    在进行Ehcache缓存开发时,首先需要搭建环境,包括导入ehcache的jar包、依赖的slf4j、ehcache配置文件以及log4j的配置文件。配置文件一般默认放置在classpath根目录下。 开发第一个缓存程序的步骤包括创建...

    spring mybatis ehcache

    标题 "spring mybatis ehcache" 涉及到的是一个集成Spring、MyBatis和Ehcache的项目实例。这个项目结合了这三个重要的Java技术,为数据库操作提供了一个高效、可扩展的解决方案。 Spring是一个开源的Java应用框架,...

    springmvc+mybatis+ehcache+freemarker+sitemesh页面布局(注解)整合实例完美运行

    本实例主要涉及的技术栈包括SpringMVC、MyBatis、EhCache、FreeMarker以及Sitemesh,这些技术都是Java Web开发中的重要组件,各自承担着不同的职责。下面将分别详细介绍这些技术以及它们在整合中的作用。 1. ...

    spring mvc、mybatis、ehcache、apache shiro、bootstrap整合开发仓库管理系统源码

    Ehcache支持内存和磁盘存储,以及分布式缓存,适用于高并发的Web应用。 4. **Apache Shiro**:Apache Shiro是一个强大的安全框架,主要用于身份验证(登录)、授权(权限控制)、会话管理和加密。在仓库管理系统中...

    MyBatis缓存功能原理及实例解析

    要使用EhCache,需要导入依赖包,并在Mapper.xml中指定使用EhCache缓存实现。然后需要导入配置文件ehcache.xml。 MyBatis缓存机制可以极大的提升查询效率,解决高并发系统的性能问题。但是需要正确地配置和使用缓存...

    mybatis-3.2.7 EHCache2.6.8 oracle 及 测试用例

    在本例中,我们使用 EHCache 作为 MyBatis 的二级缓存实现。 **Oracle** 是一个关系型数据库管理系统,广泛应用于企业级应用中。本文将介绍如何在 Oracle 10g 数据库中使用 MyBatis 和 EHCache 实现数据持久化,并...

    EHcache相关jar下载及案例

    在Java应用程序中,特别是那些基于Hibernate或MyBatis的持久层框架中,EHcache作为二级缓存工具,能够显著提升数据访问速度,减少数据库负载。 在Hibernate中,一级缓存是Session级别的,当同一个Session内的多次...

    SpringBoot+Layui搭建的学生管理系统,加入了shiro安全框架和Ehcache缓存框架.zip

    《基于SpringBoot+Layui的学生管理系统:整合Shiro安全框架与Ehcache缓存》 本项目是一个全面展示软件开发流程的实例,通过使用Java技术栈,特别是SpringBoot框架,结合前端Layui框架,构建了一个高效的学生管理...

    MyBatis缓存实现原理及代码实例解析

    MyBatis还支持与其他第三方缓存系统集成,例如Ehcache。只需要引入相应的依赖库和配置,然后在mapper.xml中指定自定义的缓存类型。 Ehcache配置示例: ```xml ``` 其中,`eviction`指定了缓存回收策略,如LRU、...

    ehcache-1.1.jar

    此外,Ehcache还支持事件监听,可以监控缓存的添加、移除和更新操作。 8. **扩展性**:Ehcache允许开发人员自定义缓存的实现,比如提供自定义的缓存策略、过期策略等,具有很高的灵活性。 9. **版本迭代**:虽然...

    尚硅谷Mybatis视频教程51-60

    教程从51到60,主要围绕Mybatis的缓存机制展开,包括一级缓存、二级缓存以及如何整合第三方缓存如ehcache。 51至54集主要讲解了Mybatis的缓存概念和实践。首先,51集引入了缓存的概念,解释了缓存在数据库操作中的...

    MyBatis3 教程 中文版PDF(永久)

    - 参照缓存:MyBatis提供了对第三方缓存的支持,例如Ehcache、Redis等。 MyBatis在设计时也考虑到了可扩展性,用户可以通过定义插件(plugins)来自定义MyBatis的核心行为。插件可以拦截方法调用并修改执行的行为,...

    MyBatis 3 中文参考文档

    MyBatis是一个流行的Java持久层框架,它支持定制化SQL、存储过程以及...开发者也可以集成第三方缓存框架,如Ehcache,来提供分布式缓存支持。缓存机制可以显著提高应用的性能,特别是在数据库访问非常频繁的情况下。

    spring 整合mybatis后用不上session缓存的原因分析

    - 在Spring中,`@Transactional`注解的使用会导致每次方法调用时创建新的SqlSession,即使是在同一个事务内,每次查询也会创建新的SqlSession实例,这样就绕过了MyBatis的一级缓存。 - 如果想要利用MyBatis的二级...

    mybatis 3 中文 指南

    MyBatis支持一级缓存和二级缓存,以减少数据库访问次数,提升性能。 - **使用自定义缓存**:允许开发者自定义缓存实现。 - **参照缓存**:使用外部缓存如EHCache。 #### 动态SQL MyBatis支持动态SQL,允许根据...

    mybatis安装包+依赖包+常用配置文件

    在本压缩包中,你将找到MyBatis的安装包、依赖包、常用的配置文件,以及一些额外的工具和组件,如MyBatis Generator插件、EHcache缓存系统和测试数据脚本。以下将详细介绍这些内容及其在实际开发中的应用。 1. **...

    spring+springmvc+mybatis项目案例实现用户角色权限管理

    整合EhCache,对Mybatis的二级缓存进行管理和对spring进行缓存管理 整合FastJson对指定http类型的数据进行转换 整合hibernate.validator校验器对controller接口参数进行校验 使用了springmvc统一异常处理 使用了...

Global site tag (gtag.js) - Google Analytics