• mybatis学习笔记(16)-mybatis整合ehcache


    mybatis学习笔记(16)-mybatis整合ehcache

    标签: mybatis



    ehcache是一个分布式缓存框架

    分布缓存

    我们系统为了提高系统并发。性能、一般对系统进行分布式部署(集群部署方式)

    分布缓存

    不使用分布缓存,缓存的数据在各各服务单独存储,不方便系统开发。所以要使用分布式缓存对缓存数据进行集中管理。

    mybatis无法实现分布式缓存,须要和其他分布式缓存框架进行整合。

    整合方法(掌握)

    mybatis提供了一个cache接口。假设要实现自己的缓存逻辑,实现cache接口开发就可以。

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

    package org.apache.ibatis.cache;
    
    import java.util.concurrent.locks.ReadWriteLock;
    
    /**
     * SPI for cache providers.
     * 
     * One instance of cache will be created for each namespace.
     * 
     * The cache implementation must have a constructor that receives the cache id as an String parameter.
     * 
     * MyBatis will pass the namespace as id to the constructor.
     * 
     * <pre>
     * public MyCache(final String id) {
     *  if (id == null) {
     *    throw new IllegalArgumentException("Cache instances require an ID");
     *  }
     *  this.id = id;
     *  initialize();
     * }
     * </pre>
     *
     * @author Clinton Begin
     */
    
    public interface Cache {
    
      /**
       * @return The identifier of this cache
       */
      String getId();
    
      /**
       * @param key Can be any object but usually it is a {@link CacheKey}
       * @param value The result of a select.
       */
      void putObject(Object key, Object value);
    
      /**
       * @param key The key
       * @return The object stored in the cache.
       */
      Object getObject(Object key);
    
      /**
       * Optional. It is not called by the core.
       * 
       * @param key The key
       * @return The object that was removed
       */
      Object removeObject(Object key);
    
      /**
       * Clears this cache instance
       */  
      void clear();
    
      /**
       * Optional. This method is not called by the core.
       * 
       * @return The number of elements stored in the cache (not its capacity).
       */
      int getSize();
    
      /** 
       * Optional. As of 3.2.6 this method is no longer called by the core.
       *  
       * Any locking needed by the cache must be provided internally by the cache provider.
       * 
       * @return A ReadWriteLock 
       */
      ReadWriteLock getReadWriteLock();
    
    }

    mybatis默认实现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<Object, Object> cache = new HashMap<Object, Object>();
    
      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();
      }
    
    }

    整合ehcache

    • 增加ehcache包
      • ehcache-core-2.6.5.jar
      • mybatis-ehcache-1.0.2.jar

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

     <!-- 开启本mapper的namespace下的二级缓存
        type:指定cache接口的实现类的类型,mybatis默认使用PerpetualCache
        要和ehcache整合,须要配置type为ehcache实现cache接口的类型
        <cache />
        -->
        <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

    增加ehcache的配置文件

    在classpath下配置ehcache.xml

    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
        <diskStore path="F:developehcache" />
        <defaultCache 
            maxElementsInMemory="1000" 
            maxElementsOnDisk="10000000"
            eternal="false" 
            overflowToDisk="false" 
            timeToIdleSeconds="120"
            timeToLiveSeconds="120" 
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU">
        </defaultCache>
    </ehcache>

    作者@brianway很多其他文章:个人站点 | CSDN | oschina

  • 相关阅读:
    从寻找资源的习惯上谈如何获得好的代码及控件(使用Koders查找)
    数据仓库的一些基本知识2
    淘宝API开发系列商家的绑定
    淘宝API开发系列开篇概述
    读取实体类的属性的备注作为表头的应用
    设置Windows服务允许进行桌面交互,实现屏幕监控
    C#进行Visio二次开发之组合形状操作
    吉日嘎啦通用权限管理系统解读及重构升华高度封装的编辑窗体
    WinForm界面开发之模块化分合
    CLR中的内存管理
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/7258565.html
Copyright © 2020-2023  润新知