`

用GemFire做Mybatis二级缓存

 
阅读更多

转自: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

分享到:
评论

相关推荐

    Gemfire pdf入门手册

    Gemfire入门手册.pdf gemfire 内存数据库

    gemfire 用户手册-英文

    gemfire V1.8.2

    GemFire8.2 windows版本

    1.安装 java se 1.8(jdk-8u111-...3.按http://gemfire.docs.pivotal.io/docs-gemfire/latest/getting_started/15_minute_quickstart_gfsh.html#topic_FE3F28ED18E145F787431EC87B676A76 上进行操作 4.打开REST 格式 ...

    gemfire开发入门

    gemfire开发文档gemfire开发文档gemfire开发文档gemfire开发文档gemfire开发文档gemfire开发文档gemfire开发文档gemfire开发文档gemfire开发文档gemfire开发文档gemfire开发文档gemfire开发文档gemfire开发文档...

    gemfire 7.0

    gemfire 7.0 安装包

    Pivotal Gemfire 9.3 文档 (pdf)

    Pivotal Gemfire 9.3 文档

    spring-data-gemfire, Java的Spring Data GemFire集成.zip

    spring-data-gemfire, Java的Spring Data GemFire集成 Spring Data GemFireweb服务的主要目标是使用关键 GemFire 作为基础分布,在内存数据管理平台中,使用关键GemFire来构建高可伸缩性。高可用性。高可用性的应用...

    spring-data-gemfire-1.8.8.RELEASE

    spring-data-gemfire-1.8.8.RELEASEspring-data-gemfire-1.8.8.RELEASEspring-data-gemfire-1.8.8.RELEASE

    Pivotal_GemFire

    Pivotal_GemFire Pivotal_GemFire Pivotal_GemFire Pivotal_GemFire

    gemfire-6.5.1.jar

    gemfire-6.5.1.jar distributed cache framework.

    io.pivotal.gemfire - 9.1.1.jar files for springboot-gemfire

    springboot-gemfire相关jar文件。版本为:9.1.1 。在Pivotal网站下载不了,所以就通过maven生成了共享出来。

    GemFire 入门指导

    GemFire 入门指导,帮助初学者迅速进入状态。

    Gemfire指导手册

    Gemfire官网权威文档,内容涵盖全面,值得研究、参考。

    GemFire:对GemFire 源码进行分析

    本站点主要是对 gemfire.org 网站的博文进行归档, 主要包括 gemfire 入门,基本特性和高级特性讲解,以及gemfire源码分析等. Overview gemfire基本特性 gemfire高级特性 gemfire源码分析

    Gemfire8.2文档

    GemFire是一个位于应用集群和后端数据源之间的高性能、分布式的操作数据(operational data)管理基础架构。它提供了低延迟、高吞吐量的数据共享和事件分发。GemFire充分利用网络中的内存和磁盘资源,形成一个实时的...

    GemFire学习指南

    介绍了GemFire入门知识,共广大学习者参考。

    effective-spring-gemfire

    使用Spring Data GemFire使用GemFire进行有效的应用程序开发 本次会议的重点是通过使用Spring Data GemFire使开发人员与Pivotal GemFire保持同步并提高生产力。 该内容适用于新手和经验丰富的GemFire用户,并展示了...

    gemfire/geode 文档,配置说明

    gemfire/geode从环境部署,搭建,到配置说明,全量的官方文档

    gemfire安装配置手册

    gemFire的安装配置手册,适用初学者的了解gemFire安装部署与学习

Global site tag (gtag.js) - Google Analytics