Mybatis整合ehcache & Mybatis整合Redis实现二级缓存

1.Mybatis整合ehcache
1.1 导入相关依赖


      	net.sf.ehcache
        ehcache
        2.10.0
      

1.2 核心接口
CacheManager:缓存管理器
Cache:缓存对象,缓存管理器内可以放置若干cache,存放数据的实质,所有cache都实现了Ehcache接口
Element:单条缓存数据的组成单位

1.3 src:ehcache.xml

hibernate整合ehcache的步奏以及使用 1、导入ehcache依赖、hibernate-ehcache的依赖
2、导入相关配置文件ehcache.xml 3、hibernate。cfg.xml中开启二级缓存(三个配置)
4、在需要缓存的实体类xxx.hbm.xml 配置加上 默认可以缓存单条记录 当要缓存导条记录的时候,需要代码手动开启二级缓存
Query.setcacheAble(true)

ssm中整合ehcache
(1) 导入相关依赖


    org.springframework
    spring-context-support
    ${spring.version}




    org.mybatis.caches
    mybatis-ehcache
    1.1.0




	net.sf.ehcache
	ehcache
	2.10.0

(2) 修改日志配置,因为ehcache使用了Slf4j作为日志输出
日志我们使用slf4j,并用log4j来实现。SLF4J不同于其他日志类库,与其它有很大的不同。
SLF4J(Simple logging Facade for Java)不是一个真正的日志实现,而是一个抽象层( abstraction layer),
它允许你在后台使用任意一个日志类库。


    2.9.1
    3.2.0
    1.7.13


    
    
    
      org.slf4j
      slf4j-api
      ${slf4j.version}
    
    
      org.slf4j
      jcl-over-slf4j
      ${slf4j.version}
      runtime
    

    
    
      org.apache.logging.log4j
      log4j-api
      ${log4j2.version}
    
    
      org.apache.logging.log4j
      log4j-core
      ${log4j2.version}
    
    
    
      org.apache.logging.log4j
      log4j-slf4j-impl
      ${log4j2.version}
    
    
    
      org.apache.logging.log4j
      log4j-web
      ${log4j2.version}
      runtime
    

    
    
      com.lmax
      disruptor
      ${log4j2.disruptor.version}
    

(3) 在Resource中添加一个ehcache.xml的配置文件

(4) 在applicationContext.xml中加入chache配置

  

    
    



    

(5)mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓存

(5.1)开启mybatis的二级缓存

   

    
        
        true
        
        false
        
        true
    

(5.2) 在XxxMapper.xml中配置cache

 
      
      
      
      
      
      
  
    
    
    
    
    
  

(5.3) 可以通过select标签的useCache属性打开或关闭二级缓存


2.Mybatis整合Redis

注意事项:
1、spring多配置文件的引入方式
2、pom中对properties文件的编译
3、加一个spring-xxx.xml一定记得在spring-Context.xml导入

(1) redis常用类
(1.1) Jedis
jedis就是集成了redis的一些命令操作,封装了redis的java客户端

(1.2) JedisPoolConfig
Redis连接池

(1.3) ShardedJedis
基于一致性哈希算法实现的分布式Redis集群客户端

实现 mybatis 的二级缓存,一般来说有如下两种方式: 1) 采用 mybatis 内置的 cache 机制。 2)
采用三方 cache 框架, 比如ehcache, oscache 等等.

(2) 添加jar依赖

(2.1) 添加redis相关依赖

 
    2.9.0
    1.7.1.RELEASE
    
      redis.clients
      jedis
      ${redis.version}
    
    
      org.springframework.data
      spring-data-redis
      ${redis.spring.version}
    
    版本冲突问题:
      1. ClassNotFoundException  : redis/client/util/geoUtils    说这个类找不到。
      2. org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'redisTemplate' defined in class path resource [applicationContext.xml]
         说创建 redisTemplate bean 对象时失败了。
    redis.client 2.9.0 ---- spring-data-redis  1.7.1.RELEASE 
      redis.client 2.9.0 ---- spring-data-redis  1.7.2.RELEASE    这两个是可以使用的

(2.2) log4j2配置:Log4j2 + Slf4j (如上面整合ehcache相同)

(2.3) jackson

(3)spring + redis 集成实现缓存功能(与mybatis无关)

(3.1) 添加两个redis的配置文件,并将redis.properties和spring-redis.xml配置到applicationContext.xml文件中

  注1:将redis.properties导入到applicationContext.xml文件中

  spring中引入第二个属性文件会出现“找不到某个配置项”错误,这是因为spring只允许有一个    

        
  

  
  

  注2:通过import标签将spring-redis.xml导入到applicationContext.xml文件中
       
       

(3.2) 将redis缓存引入到mybatis中

 a. 创建mybatis的自定义缓存类“RedisCache”,必须实现org.apache.ibatis.cache.Cache接口
    RedisCache.java

b. 静态注入中间类“RedisCacheTransfer”,解决RedisCache中RedisTemplate的静态注入,从而使MyBatis实现第三方缓存
    RedisCacheTransfer.java

c. spring与mybatis整合文件中开发二级缓存

d. 在XxxMapper.xml中添加自定义cache功能


type:指定redis的二级缓存类的全路径名
eviction:二级缓存算法(FIFO/LRU/SOFT/WEAK)
flushInterval:刷新间隔,间隔多长时间清空缓存,被动触发非定时器轮询
size:缓存大小。每个缓存可以存储 1024 个列表或对象的引用
readOnly:缓存将作为“读/写”缓存,意味着获取的对象不是共享的且对调用者是安全的。不会有其它的调用者或线程潜在修改。

注意: pom对properties文件的加载!!!

资料:
MyBatis内置的二级缓存算法 Mybatis的所有Cache算法都是基于装饰器模式对PerpetualCache扩展增加功能。
1)FIFO:先入先出,基于LinkedList实现; 2)LRU:最近最少使用,基于LinkedHashMap实现,在put的时候,自动移除最少使用缓存对象;
3)SOFT:对Cache的value进行SoftReference包装;当缓存对象是Soft reference可达时,gc会向系统申请更多内存,而不是直接回收它,当内存不足的时候才回收它;
4)WEAK:对Cache的value进行WeakReference包装;WeakReference不会强制对象保存在内存中。它拥有比较短暂的生命周期,允许你使用垃圾回收器的能力去权衡一个对象的可达性。在垃圾回收器扫描它所管辖的内存区域过程中,一旦gc发现对象是weakReference可达,就会把它放到ReferenceQueue中,等下次gc时回收它。

你可能感兴趣的:(Mybatis整合ehcache & Mybatis整合Redis实现二级缓存)