`

spring+Mybatis+Ehcache整合

 
阅读更多

项目用到spring+mybatis框架,弄了一上午的spring+ehcache的整合,就是不见效果,后来发现Mybatis与Ehcache整合也需要进行配置,两个都配置会大大降低数据库压力。下面把我的配置过程写下来供大家参考。

 

1. 下载mybatis相关包与ehcache相关包

下载地址为:https://github.com/mybatis/ehcache-cache/releases

2. 在Map文件中打开echached效果,userMapper.xml文件内容如下:

 

<?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.erpbase.dao.UserMapper">
              <!-- 以下两个<cache>标签二选一,第一个可以输出日志,第二个不输出日志 -->
	<cache type="org.mybatis.caches.ehcache.LoggingEhcache" />
	<cache type="org.mybatis.caches.ehcache.EhcacheCache" />
	......
</mapper>

 3. 配置ehcache.xml 

 

<?xml version="1.0" encoding="UTF-8"?>  
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
    <diskStore path="java.io.tmpdir"/> 
   
    <defaultCache    
            maxElementsInMemory="3000"    
            eternal="false"    
            timeToIdleSeconds="3600"    
            timeToLiveSeconds="3600"    
            overflowToDisk="true"    
            diskPersistent="false"    
            diskExpiryThreadIntervalSeconds="100"    
            memoryStoreEvictionPolicy="LRU"    
            />    
    <cache name="userCache"    
           maxElementsInMemory="3000"    
           eternal="false"    
           overflowToDisk="true"    
           timeToIdleSeconds="3600"    
           timeToLiveSeconds="3600"    
           memoryStoreEvictionPolicy="LFU"    
            />  
    ......
</ehcache>

 参数说明:

 

 <!-- 

        name: cache的名字,用来识别不同的cache,必须惟一。   

maxElementsInMemory: 内存管理的缓存元素数量最大限值。   

maxElementsOnDisk: 硬盘管理的缓存元素数量最大限值。默认值为0,就是没有限制。   

eternal: 设定元素是否持久话。若设为true,则缓存元素不会过期。   

overflowToDisk: 设定是否在内存填满的时候把数据转到磁盘上。

timeToIdleSeconds: 设定元素在过期前空闲状态的时间,只对非持久性缓存对象有效。默认值为0,值为0意味着元素可以闲置至无限长时间。   

timeToLiveSeconds: 设定元素从创建到过期的时间。其他与timeToIdleSeconds类似。   

diskPersistent: 设定在虚拟机重启时是否进行磁盘存储,默认为false.(我的直觉,对于安全小型应用,宜设为true)。   

diskExpiryThreadIntervalSeconds: 访问磁盘线程活动时间。   

diskSpoolBufferSizeMB: 存入磁盘时的缓冲区大小,默认30MB,每个缓存都有自己的缓冲区。   

memoryStoreEvictionPolicy: 元素逐出缓存规则。共有三种,Recently Used (LRU)最近最少使用,为默认。 First In First Out (FIFO),先进先出。Less Frequently Used(specified as LFU)最少使用  

--> 

4. 配置applicationContext-ehcache.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<!-- /** * * 缓存配置 *  * */ -->
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:ehcache="http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring"
	xsi:schemaLocation="    
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd    
    http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring  
    http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring/ehcache-spring-1.1.xsd">

	<!-- <ehcache:annotation-driven /> -->

	<ehcache:annotation-driven cache-manager="ehcacheManager" />

	<ehcache:config cache-manager="ehcacheManager">
		<ehcache:evict-expired-elements interval="60" />
	</ehcache:config>
	
	<bean id="ehcacheManager"
		class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
		<property name="configLocation" value="classpath:ehcache.xml" />
	</bean>
</beans>

 5. 在spring-mvc.xml 中加入如下内容,将ehcache相关配置装配到spring容器中:

 

 

<!-- 加载ehcache缓存配置文件   
    	说明:在这里我遇到了这样一个问题,当使用@Service等注解的方式将类声明到配置文件中时,  
   	 	就需要将缓存配置import到主配置文件中,否则缓存会不起作用  
    	如果是通过<bean>声明到配置文件中时,  
    	则只需要在web.xml的contextConfigLocation中加入applicationContext-ehcache.xml即可,  
    	不过还是推荐使用如下方式吧,因为这样不会有任何问题  
    -->  
    <import resource="classpath:applicationContext-ehcache.xml"/>

 6. 在userServiceImpl.java中加入通过注解进行配置:

 

 

        @Cacheable(cacheName="userCache")  //这里的cacheName要跟ehcache.xml中保持一致
	public List<User> getUserList(User user, Map<String, Object> map) {
		long l1 = new Date().getTime();

		List<User> list = userMapper.getUserList(user);
		Integer listSize = userMapper.getUserCount(user);

		long l2 = new Date().getTime();
		System.out.println("++++++++++++total time use: " + (l2-l1));

		map.put("rows", list);
		map.put("total", listSize);

		return list;
	}

 

 

到此spring+mybatis+EHCache配置完成。可以对比在加上@Cacheable(cacheName="userCache")和不加的两种情况下的(l2-l1)的时间,在我本地如果不加用时在40ms左右,加上之后第一次加载是40ms,第二次用时1ms,说明第一次加载的数据已经被放到缓存当中去,可见效率得到极大提升。

 

 

 

拓展说明:

对于清除缓存的方法,ehcache提供了两种,一种是在ehcache.xml中配置的时间过后自动清除,一种是在数据发生变化后触发清除。个人感觉第二种比较好。可以将 

@TriggersRemove(cacheName="userCache",removeAll=true)

@TriggersRemove(cacheName="userCache", when=When.AFTER_METHOD_INVOCATION, removeAll=true) 

这句代码加到service里面的添加、删除、修改方法上。这样只要这几个方法有调用,缓存自动清除。

 

对于Mybatis更简单,对不想缓存的sql结果,可以再后面添加useCache="false"即可:

  <select id="getLabelValueList" resultMap="BaseResultMap" parameterType="com.Product" useCache="false">
		select Id, Name
		from Product
		where Enable = 1
		<if test="shopid != null and shopid != 0 " >
		  AND Id not in (select Productid from shopproduct where shopid = #{shopid}) 
		</if>
		order by Id
  </select>

 

5
0
分享到:
评论
2 楼 追梦少年蒋富贵 2016-10-13  
楼主 你这个有问题 在 mapper 配置那段代码之后 ,不通@cacheable 
就可以缓存对象了  。 貌似是 ehcache 做的是 mybtis 的二级缓存,  二级缓存有问题 ,他是以mapper 为单位 一个mapper 中 只要发生了 insert update delete  真个 mapper的缓存就清空  
1 楼 Blod123 2016-06-16  
如果不在mapper中写 <cache type="org.mybatis.caches.ehcache.LoggingEhcache" /> 则不起做用;


但是貌似hibernate和ehcache整合时 直接用的spring 的@Cache 是没问题的

相关推荐

    Spring MVC+Mybatis+Ehcache+Apache Shiro+Bootstrap整合开发java仓库管理系统源码

    积分最低,Spring MVC+Mybatis+Ehcache+Apache Shiro+Bootstrap整合开发java仓库管理系统源码 开发环境:Eclipse ,JDK 1.8 ,Tomcat7 技术选型 后端技术 SpringMVC MVC框架 Spring Framework 容器 Apache ...

    springMVC+mybatis+ehcache整合

    总的来说,"springMVC+mybatis+ehcache整合"项目提供了从Web交互到数据库操作再到数据缓存的一站式解决方案。理解并掌握这三个技术的集成,对于开发高效、可维护的Java Web应用具有重要意义。通过下载提供的项目,...

    《Java EE企业级应用开发教程Spring+Spring MVC+MyBatis》_源代码.zip

    5. **Chapter 08** - Spring与MyBatis整合:展示如何将Spring的IoC容器与MyBatis集成,实现数据库操作的事务管理。解释SqlSessionFactoryBean和DataSource配置,以及使用MyBatis的Spring命名空间简化配置。 6. **...

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

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

    springmvc+Mybatis+activiti5

    此项目为springmvc、Mybatis、EHcache、maven、Spring security3、activiti5工作流的整合 是一个基于数据库的权限管理demo项目、使用mysql数据库 项目运行前需要构建maven私服 而且有些jar包私服中肯定没有,需要...

    Spring+MyBatis/Hibernate+Ehcache+Maven的Demo Web项目(稳定版)

    1.标题所提及技术的整合,Spring包括mvc、aop、ioc等。个人属于强迫症类型,技术水平怎么样再说,代码必须好看 2.Hibernate几个级别缓存对比。见DaoImpl类 3.Ehcache方法缓存及页面缓存。见applicationContext-cache...

    spring+ehcache+mabatis

    spring+ehcache+mabatis。测试用例用的是mysql,数据库的配置在jdbc.properties里面。所要的sql在src/main/resources下的student.sql。测试的话调用controller下的update和getOne那两个接口测试。

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

    SpringMVC、Mybatis、Spring、Shiro和Ehcache这五个技术组件是Java Web开发中的关键工具,它们各自承担着不同的职责,并通过整合来实现强大的功能。下面将详细阐述这些技术以及它们在整合中的作用。 首先,...

    spring+springMVC+mybatis整合简单的增删查改

    本次上传的资源是spring+springMVC+mybatis整合的简单增删查改,有助于初学者在idea软件上操作,其中用到的数据库是mysql,资源里面还整合了spring的ehcache二级缓存。

    Springmvc+spring+mybatis的web整合

    在现代企业级应用开发中,SpringMVC、Spring和MyBatis这三大框架的整合是极为常见的技术选型。它们各自承担着不同的职责,SpringMVC作为轻量级的MVC框架负责处理HTTP请求,Spring作为核心容器管理依赖注入(DI)和...

    JavaWeb开发之Spring+SpringMVC+MyBatis+SpringSecurity+EhCache+JCaptcha 完整Web基础框架

    本篇文章将详细讲解基于Spring、SpringMVC、MyBatis、SpringSecurity、EhCache和JCaptcha这六大组件构建的Web框架。 1. **Spring**: Spring作为整个框架的核心,提供了依赖注入(DI)和面向切面编程(AOP)等特性...

    Struts2+Spring+Mybatis框架jar

    Struts2+Spring+Mybatis 是一种常见的Java Web开发框架组合,被广泛应用于企业级应用中。这个框架组合的优点在于它能有效地管理控制层、业务层和服务层,从而提高开发效率和代码的可维护性。 Struts2是Action导向的...

    Spring MVC+Mybatis+Ehcache+Apache Shiro+Bootstrap整合开发java仓库管理系统

    Spring Framework 容器 Apache Shiro 安全框架 Mybatis ORM框架 MyBatis Generator 代码生成 C3P0 数据库连接池 Ehcache 进程内缓存框架 Apache poi 文件导入导出 Maven 项目构建管理 前端技术 jQuery , ...

    Spring+MyBatis/Hibernate+Ehcache+Maven的Demo Web项目

    1.标题所提及技术的整合,Spring包括mvc、aop、ioc等。个人属于强迫症类型,技术水平怎么样再说,代码必须好看 2.Hibernate几个级别缓存对比。见DaoImpl类 3.Ehcache方法缓存及页面缓存。见applicationContext-cache...

    SpringMvc+MyBatis+ehcache+ExtJs分页

    整合Spring MVC、MyBatis和Ehcache的过程通常包括以下步骤: 1. 配置Spring MVC:设置DispatcherServlet、配置MVC相关组件,如ViewResolver、HandlerMapping等。 2. 集成MyBatis:配置SqlSessionFactory,创建Mapper...

    spring+mybatis整合redis所需jar包

    包含:commons-pool2-2.5.0.jar、jedis-2.5.0.jar、mybatis-ehcache-1.0.3.jar、spring-data-redis-1.2.0.RELEASE.jar

    struts2+mybatis+spring3框架整合

    通过以上介绍,我们可以看到,Struts2、MyBatis和Spring3的整合提供了强大的功能,能够有效地组织和管理复杂的Java Web应用程序。理解并熟练运用这些框架,可以提升开发者的专业技能,为开发高质量的Web应用打下坚实...

    Spring 3.0+Struts2+Mybatis 3 + p6spy 平台框架

    这是自己整合的Spring 3.0+Struts2+Mybatis 3 + p6spy +ehcache的平台框架,内含一点示例代码,目前ehcache没有使用。直接编译后发布就能用 测试环境基于JDK1.6+Tomcat 6.0. 大家拿到后请根据实际情况修改 ...

Global site tag (gtag.js) - Google Analytics