`

用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

分享到:
评论

相关推荐

    hibernate二级缓存

    要启用Hibernate的二级缓存,首先需要选择一个缓存提供商,如Ehcache、Infinispan或Gemfire等。Ehcache是一种广泛使用的开源缓存解决方案,它提供了内存和磁盘存储,并且支持JMX管理。在Hibernate中配置Ehcache,...

    hibernate二级缓存要导入的包

    这些包可能包括Hibernate核心库、特定的二级缓存提供者(如Ehcache、Infinispan、Gemfire等)以及它们的配置文件。例如,如果使用Ehcache作为二级缓存实现,你需要引入`hibernate-ehcache`的jar包,并在Hibernate...

    Hibernate二级缓存+分页功能

    在Java的持久化框架Hibernate中,二级缓存和分页功能是两个重要的优化手段,能够显著提升应用程序的性能和用户体验。下面将详细讲解这两个概念及其实际应用。 **一、Hibernate二级缓存** Hibernate一级缓存是指...

    GemFire学习指南

    二、GemFire架构 GemFire架构主要包括三个部分: GemFire Distributed System、Region和缓存。 1. GemFire Distributed System:GemFire Distributed System是一个分布式系统,运行在多个VM上,每个VM作为一个...

    Gemfire pdf入门手册

    手册的第二部分是关于如何开始使用vFabric GemFire,包括: 1. 在15分钟内入门GemFire的快速介绍。 2. 关于vFabric GemFire的概述。 3. vFabric GemFire的主要特性介绍。 4. 如何安装vFabric GemFire,涵盖了不同...

    Hibernate缓存深入详解

    在分布式环境中,二级缓存可以配置为分布式缓存,如使用GemFire或Terracotta等技术,使得缓存数据能在集群中的各个节点之间共享,提高系统的可扩展性和可用性。 总结来说,Hibernate的缓存机制通过减少数据库交互,...

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

    4. **使用缓存API**:SpringBoot应用可以通过Gemfire的API进行数据的读写操作,例如`CacheFactory`、`Region`和`CacheLoader`等。 5. **实现事件监听器**:Gemfire支持监听器机制,可以在数据变更时触发相应的回调...

    gemfire 用户手册-英文

    #### 二、gemfire简介 gemfire是一款分布式数据管理解决方案,旨在提高应用程序性能和可扩展性。它支持高速的数据访问和处理,适用于需要实时数据分析的应用场景。gemfire的主要特点包括: - **高可用性**:...

    gemfire 7.0

    此版本是vFabric GemFire的重要升级,它旨在提供更高效、更可靠的企业级解决方案。 【描述】"gemfire 7.0 安装包" 提供了完整的安装程序,使用户能够便捷地在自己的环境中部署和配置GemFire 7.0。这个版本包含了多...

    gemfire简单搭建

    这将启动一个名为 `server1` 的服务器,连接到 `locator1` 定位器,使用 `/etc/gphd/GemFire/SampleCode/quickstart/xml/Server.xml` 文件作为缓存配置文件,并设置 Java 虚拟机参数为 `-Xmx8192m` 和 `-Xms8192m`。...

    GemFire 入门指导

    #### 二、GemFire 分布式系统 (Distributed System) - **定义**: 由一组运行在不同VM上的GemFire实例组成。每个VM都作为一个GemFire对等体存在。 - **特点**: 各个对等体之间通过网络通信实现数据的同步与交互。 - ...

    Gemfire指导手册

    Gemfire不仅能够作为高性能的数据缓存系统,还能作为一个完整的数据库平台使用。 ### 主要特点 Gemfire的主要特点包括: 1. **高性能与低延迟**:由于数据存储在内存中,因此能够实现极快的数据访问速度。 2. **...

    GemFire 学习笔记

    GemFire 是一款高性能、分布式内存数据网格系统,由 Pivotal 公司开发,主要用于构建大规模、高可用性的企业级应用程序。它提供了一个分布式的数据存储解决方案,支持实时数据访问和处理,适用于需要快速数据交换和...

    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 os conf

    使用这样的工具可以帮助监控和分析 GemFire 集群的运行状况,包括内存使用、吞吐量、延迟等。通过定期收集和分析这些数据,我们可以识别性能瓶颈,调整配置以优化系统性能。 总的来说,理解并正确配置 GemFire OS ...

    Pivotal Gemfire 9.3 文档 (pdf)

    #### 二、Pivotal Gemfire 介绍 - **Pivotal GemFire**:一种分布式内存数据网格解决方案,用于存储和处理大量数据,并提供高性能的数据访问。 - **主要特点**: - **高性能**:通过内存中的数据存储来提高应用性能...

    java之数据库缓存

    例如,Redis的命令行客户端redis-cli,或使用JMX监控Hibernate二级缓存的性能。此外,像Prometheus和Grafana这样的度量和可视化工具可以帮助我们分析和优化缓存的使用情况。 在实践中,合理配置缓存大小、设置合适...

    gemfire、geode多节点集群部署踩坑大全.docx

    GemFire/Geode 是一种分布式内存对象管理系统,广泛应用于大型企业级应用中。然而,在实际部署中,遇到的一些坑和难点,会导致部署失败或效率不高。以下是 GemFire/Geode 多节点集群部署踩坑大全,旨在帮助新学习 ...

Global site tag (gtag.js) - Google Analytics