设为首页 收藏本站
查看: 499|回复: 0

[经验分享] 用GemFire做Mybatis二级缓存

[复制链接]

尚未签到

发表于 2016-11-25 08:56:51 | 显示全部楼层 |阅读模式
  转自:http://blog.sina.com.cn/s/blog_72ef7bea0101basm.html
  MyBatis支持第三方二级缓存实现,目前支持Ehcache、Hazelcast和OSCache。
  GemFire不在支持的范围,但是可以通过实现org.apache.ibatis.cache.Cache接口来使用。


1、设置MyBatis的Cache全局使用开关:默认是true,如果它配成false,其余各个Mapper XML文件配成支持cache也没用。

<settings>
   <setting name="cacheEnabled" value="true"/>
</settings>




2、各个Mapper XML文件,默认是不采用cache。在配置文件加一行就可以支持cache:

<mapper namespace="org.acme.FooMapper">

    <cache type="com.yqu.mybatis.caches.gemfire.GemfireCache"/>

    ...

</mapper>




3、实现GemfireCache

package com.yqu.mybatis.caches.gemfire;

import com.gemstone.gemfire.cache.AttributesFactory;
import com.gemstone.gemfire.cache.CacheFactory;
import com.gemstone.gemfire.cache.Region;

import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

import org.apache.ibatis.cache.Cache;
import org.apache.ibatis.cache.CacheException;

public final class GemfireCache implements Cache {
    private static Region<Object, Object> mybatis_region = null;
    private Region<Object, Object> region = null;    
    private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
    private String id;
    
    public void setId(String id) {
        this.id = id;
    }
    
    public void setRegion(Region<Object, Object> region) {
        this.region = region;
    }
    
    public Region<Object, Object> getRegion() {
        return region;
    }
    
    private static synchronized Region<Object, Object> getParentRegion()
    {
        if(mybatis_region==null)
        {
            com.gemstone.gemfire.cache.Cache cache = new CacheFactory()
                .set("name", "mybatis_gemfire_cache")
                .set("cache-xml-file", "gemfire.xml").create();
            mybatis_region = cache.getRegion("mybatis_gemfire_region");
        }
        return mybatis_region;
    }
    
    @SuppressWarnings({ "deprecation", "unchecked", "rawtypes" })
    public GemfireCache(String id) {
        if (id == null) {
            throw new IllegalArgumentException("Cache instances require an ID");
        }
        this.id = id;
                
        region = getParentRegion().getSubregion(id);
        if (null == region) {
            AttributesFactory attrFactory =
                    new AttributesFactory(mybatis_region.getAttributes());
            
            region = mybatis_region.createSubregion(id, attrFactory.create());
        }
    }
    
    public void clear() {
        if (null != region) {
            try {
                region.clear();
            } catch (Throwable t) {
                throw new CacheException(t);
            }    
        }
    }
    
    public String getId() {
        return this.id;
    }
    
    public Object getObject(Object key) {
        Object retVal = null;
        if (null != region) {
            if (region.containsKey(key.hashCode())) {
                try {
                    retVal = region.get(key.hashCode());
                } catch (Throwable t) {
                    throw new CacheException(t);
                }    
            }
        }
        return retVal;
    }
    
    public ReadWriteLock getReadWriteLock() {
        return this.readWriteLock;
    }
    
    public int getSize() {
        if (null != region) {
            try {
                return region.size();
            } catch (Throwable t) {
                throw new CacheException(t);
            }
        }
        return 0;
    }
    
    public void putObject(Object key, Object value) {
        if (null != region) {
            try {
                region.put(key.hashCode(), value);
            } catch (Throwable t) {
                throw new CacheException(t);
            }
        }
    }
    
    public Object removeObject(Object key) {
        if (null != region) {
            try {
                return region.remove(key.hashCode());
            } catch (Throwable t) {
                throw new CacheException(t);
            }
        }
        return null;
    }
    
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (!(obj instanceof Cache)) {
            return false;
        }
        
        Cache otherCache = (Cache)obj;
        return this.id.equals(otherCache.getId());
    }
    
    @Override
    public int hashCode() {
        return this.id.hashCode();
    }
    
    @Override
    public String toString() {
        return "GemfireCache{" + this.id + "}";
    }
}




4、Mapper XML文件配置支持cache后,文件中所有的Mapper statement就支持了。此时要个别对待某条可以通过useCache禁止使用cache:

<select id="inetAton" parameterType="string" resultType="integer" useCache=“false”>    
  select inet_aton(#{name})
</select>




参考  http://howtodoinjava.com/2013/01/06/how-to-enable-caching-in-ibatis-using-oscache/
  http://www.webdbtips.com/60455/
  http://blog.csdn.net/xuezhimeng/article/details/7378096
  http://grepcode.com/file/repo1.maven.org/maven2/org.mybatis.caches/mybatis-ehcache/1.0.0-RC1/org/mybatis/caches/ehcache/EhcacheCache.java

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-305233-1-1.html 上篇帖子: mybatis批量插入数据 下篇帖子: Mybatis XML配置信息说明
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表