网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

mybatis和ehcache怎么实现缓存

本篇内容介绍了“mybatis和ehcache怎么实现缓存”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

创新互联建站服务项目包括平阳网站建设、平阳网站制作、平阳网页制作以及平阳网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,平阳网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到平阳省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

缓存的概念

        java里缓存可以分两种情况,一种是JVM的缓存,这个是JVM与操作系统打交道用的,在使用java语言开发时,一般不用到。

        一种是java语言缓存,这里的缓存是一种机制,不与任何硬件相关。比如一个 static的变量, 当第一次访问他时我们到文件里读他的值,以后访问时,直接把这个值返回去,这里省下了IO的时间,提高了效率,这就是一个简单的缓存机制。

一级缓存

        一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构用于存储缓存数据。不同的sqlSession之间的缓存数据区域是互相不影响的。也就是他只能作用在同一个sqlSession中,不同的sqlSession中的缓存是互相不能读取的。

处理流程:

mybatis和ehcache怎么实现缓存

        用户发起查询请求,查找某条数据,sqlSession先去缓存中查找,是否有该数据,如果有,读取;

        如果没有,从数据库中查询,并将查询到的数据放入一级缓存区域,供下次查找使用。

        但sqlSession执行commit,即增删改操作时会清空缓存。这么做的目的是避免脏读。

        如果commit不清空缓存,会有以下场景:A查询了某商品库存为10件,并将10件库存的数据存入缓存中,之后被客户买走了10件,数据被delete了,但是下次查询这件商品时,并不从数据库中查询,而是从缓存中查询,就会出现错误。

二级缓存

        二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。

        UserMapper有一个二级缓存区域(按namespace分),其它mapper也有自己的二级缓存区域(按namespace分)。每一个namespace的mapper都有一个二级缓存区域,两个mapper的namespace如果相同,这两个mapper执行sql查询到数据将存在相同的二级缓存区域中。

处理流程:

mybatis和ehcache怎么实现缓存

这里有一个问题,既然有了一级缓存,那么为什么要提供二级缓存呢?

        二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。二级缓存的作用范围更大。

        还有一个原因,实际开发中,MyBatis通常和Spring进行整合开发。Spring将事务放到Service中管理,对于每一个service中的sqlsession是不同的,这是通过mybatis-spring中的org.mybatis.spring.mapper.MapperScannerConfigurer创建sqlsession自动注入到service中的。 每次查询之后都要进行关闭sqlSession,关闭之后数据被清空。所以spring整合之后,如果没有事务,一级缓存是没有意义的。

二级缓存的使用:

1,打开总开关

在MyBatis的配置文件中加入:

    

       

        

2,在需要开启二级缓存的mapper.xml中加入caceh标签

3,让使用二级缓存的POJO类实现Serializable接口

public class User implements Serializable {}

整合ehcache

        分布式缓存能够高性能地读取数据、能够动态地扩展缓存节点、能够自动发现和切换故障节点、能够自动均衡数据分区,而且能够为使用者提供图形化的管理界面,部署和维护都十分方便。

        而mybatis无法实现分布式缓存,需要和其它分布式缓存框架进行整合。这里简单介绍和ehcache整合。

整合流程:

        mybatis提供了一个cache接口,如果要实现自己的缓存逻辑,实现cache接口开发即可。

        mybatis和ehcache整合,mybatis和ehcache整合包中提供了一个cache接口的实现类。

package org.apache.ibatis.cache.impl;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import org.apache.ibatis.cache.Cache;
import org.apache.ibatis.cache.CacheException;
/** * @author Clinton Begin */
public class PerpetualCache implements Cache {  
   private String id;  
   private Map cache = new HashMap();  
   public PerpetualCache(String id) {    
       this.id = id;    }  
   public String getId() {    
       return id;    }
    public int getSize() {    
        return cache.size();    }  
   public void putObject(Object key, Object value) {        cache.put(key, value);    }  
   public Object getObject(Object key) {    
        return cache.get(key);    }
    public Object removeObject(Object key) {  
        return cache.remove(key);    }  
    public void clear() {        cache.clear();    }  
   public ReadWriteLock getReadWriteLock() {    
       return null;    }  
   public boolean equals(Object o) {    
      if (getId() == null) throw new CacheException("Cache instances require an ID.");    
      if (this == o)
          return true;    
      if (!(o instanceof Cache))
          return false;       Cache otherCache = (Cache) o;    
       return getId().equals(otherCache.getId());    }  
   public int hashCode() {    
       if (getId() == null) throw new CacheException("Cache instances require an ID.");    
           return getId().hashCode();   } }

配置步骤:

1,配置mapper中cache中的type为ehcache对cache接口的实现类型

        表示开启此mapper的namespace下的二级缓存  

type表示指定cache接口的实现类的类型,mybatis默认使用PerpetualCache。

要和ehcache整合,需要配置type为ehcache实现cache接口的类型。

2,加入ehcache的配置文件

        在classpath下配置ehcache.xml


    
    
    

3,Maven中ehcache 相关依赖


     org.ehcache
     ehcache
     3.1.3
     
 
 
     org.mybatis
     mybatis-ehcache
     1.0.0

最后,简单比较三个比较流行的缓存工具。

        ehcache 是一个纯Java的进程内缓存框架,hibernate使用其做二级缓存。同时,ehcache可以通过多播的方式实现集群。

        memcache是一套分布式的高速缓存系统,提供key-value这样简单的数据储存,可充分利用CPU多核,无持久化功能。

        redis高性能的key-value系统,提供丰富的数据类型,单核CPU有抗并发能力,有持久化和主从复制的功能。

“mybatis和ehcache怎么实现缓存”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!


分享名称:mybatis和ehcache怎么实现缓存
本文路径:http://bjjierui.cn/article/ipsioh.html

其他资讯