`
songbin0201
  • 浏览: 323093 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

浅析ibatis的cache实现

 
阅读更多
ibatis提供四种缓存方案,LRU、FIFO、MEMORY、EHCACHE,通过定义不同的cacheModel,将数据缓存在cache中。

具体写法参考如下
<cacheModel id="cache-name" type="LRU" readOnly="true" serialize="false">
    <property name="cache-size" value="1000" />
</cacheModel>

<select id="getBean" resultMap="bean" cacheModel="cache-name">
    <![CDATA[select * from table]]>
</select>


一、参见com.ibatis.sqlmap.engine.builder.xml.SqlMapParser

parser.addNodelet("/sqlMap/cacheModel", new Nodelet() {
      public void process(Node node) throws Exception {
        vars.currentCacheModel = new CacheModel();
        vars.currentProperties = new Properties();
      }
    });

parse在解析xml的时候,遇到一个cacheModel标签,则创建一个CacheModel的对象

vars.currentCacheModel.setControllerClassName(type);

if (vars.client.getDelegate().isCacheModelsEnabled()) {
          vars.client.getDelegate().addCacheModel(vars.currentCacheModel);
}

并通过如上方法,成功的将cacheModel对象加入到map中缓存起来,同时为cacheModel设置缓存控制器(LRU、FIFO、MEMORY、EHCACHE),实现不同的缓存方案

因为是单例模式, SqlMapExecutorDelegate通过HashMap cacheModels ,持有了全部的cacheModel,并作为静态对象全局共享。


二、参见com.ibatis.sqlmap.engine.builder.xml.SqlStatementParser

解析statement时,如果cache可用,获取到对应的cacheModel,执行相关的缓存操作
if (cacheModelName != null && cacheModelName.length() > 0 && vars.client.getDelegate().isCacheModelsEnabled()) {
    CacheModel cacheModel = vars.client.getDelegate().getCacheModel(cacheModelName);
    return new CachingStatement(statement, cacheModel);
}


三、参见com.ibatis.sqlmap.engine.mapping.statement.CachingStatement
CachingStatement封装了很多query的方法,以executeQueryForObject为例
    CacheKey cacheKey = getCacheKey(request, parameterObject);
    cacheKey.update("executeQueryForObject");
    Object object = cacheModel.getObject(cacheKey);
    if (object == CacheModel.NULL_OBJECT){
    	//	This was cached, but null
    	object = null;
    }else if (object == null) {
       object = statement.executeQueryForObject(request, trans, parameterObject, resultObject);
       cacheModel.putObject(cacheKey, object);
    }
    return object;

如果没从cacheModel中获取到缓存数据,则继续查询,并将查询结果放到缓存中。
从这里的代码也能看到,cacheModel是允许存在缓存对象为null的情况,因此如果查询结果为null,也会缓存起来,这里要稍加注意。

四、参加com.ibatis.sqlmap.engine.cache.CacheModel
cacheModel.getObject(cacheKey)的方法,由cacheMode定义的cacheController实现(LRU、FIFO、MEMORY、EHCACHE),cacheModel作为单例类的成员变量,可以全局共享,同样CacheController做为cacheModel的成员变量,也可以全局共享,这样CacheController持有的Map cache和List keyList,也在cacheModel可以控制的范围内全局共享了,这样就实现了缓存的效果。
这里有个有意思的地方,由于cacheModel在getObject的时候,会自动统计request和hit的次数,因此使用缓存的方式,cacheModel可以提供输出缓存命中率的方法 -- 参见 public double getHitRatio()
分享到:
评论
2 楼 ljw8822 2014-08-30  
1 楼 wang_xiao_bao 2012-07-19  
http://www16.atpages.jp/sekom/ibatis-2.3.0.677/doxygen/classcom_1_1ibatis_1_1sqlmap_1_1engine_1_1mapping_1_1statement_1_1_caching_statement.html

相关推荐

    Struts2+Spring+iBATIS架构实现

    Struts2 Spring iBATIS 架构 实现 Struts2 Spring iBATIS 架构 实现 Struts2 Spring iBATIS 架构 实现 Struts2 Spring iBATIS 架构 实现

    ibatis 框架原理实现

    **Ibatis 框架原理实现** Ibatis 是一个优秀的持久层框架,它允许开发者将SQL语句直接写在XML配置文件中,从而避免了Java代码与SQL的耦合,提高了开发效率。在这个自己编写的Ibatis框架实现中,我们可以看到类似的...

    Java_ibatis-cache.rar_cache

    在Java开发领域,iBatis作为一个轻量级的持久层框架,因其简洁高效而深受开发者喜爱。...阅读《Java_iBatis cache.doc》文档,你会获得更详细的实践指导和示例代码,进一步深化对iBatis缓存的理解。

    ibatis实现原理解析

    在本篇文章中,我们将深入解析Ibatis的实现原理,探讨其核心功能、工作流程以及优势。 一、Ibatis的核心概念 1. SQL映射文件:Ibatis通过XML或注解方式定义SQL语句,这些语句被封装在SQL映射文件中。映射文件包含...

    ibatis实现分页技术

    本篇将详细讲解如何利用Ibatis实现分页技术。 一、Ibatis简介 Ibatis是由Clinton Begin创建的一个SQL映射框架,它允许开发者将SQL语句直接写在配置文件中,通过Java接口与数据库进行交互,从而避免了传统的JDBC代码...

    ibatis应对批量update

    通过上述步骤,我们可以在ibatis中实现高效的批量更新操作,极大地提升系统处理大规模数据的能力。这种方法不仅适用于Java环境下的开发,也适用于其他支持ibatis的编程语言。总之,ibatis提供的批量更新功能是处理...

    Ibatis和Spring整合例子,实现增删改查功能

    Ibatis和Spring整合例子,实现增删改查功能.

    ibatis框架实现的增删改查

    本篇文章将深入探讨如何使用Ibatis框架实现对`student`表的增删改查操作,包括模糊查询以及利用序列自动生成主键。 首先,我们来理解Ibatis的基本概念。Ibatis是由Apache基金会维护的一个开源项目,它是一个SQL映射...

    struts2+spring+ibatis+oracle+分页搜索+上传附件实例

    综上所述,这个实例展示了如何整合Struts2、Spring、iBatis和Oracle来构建一个完整的Web应用,实现了动态分页搜索和附件上传功能。这种架构具有良好的可扩展性和可维护性,适用于各种中大型企业级项目。开发者可以...

    ibatis实现增删改查功能demo

    Ibatis允许缓存(Local Cache和Second Level Cache)以提高性能,还可以使用StatementType(PreparedStatement比Statement更安全且性能更好)进行SQL预编译。 通过上述步骤,"ibatis实现增删改查功能demo"项目展示...

    ibatis实现数据的操作

    本篇文章将详细讲解如何利用Ibatis实现数据的连接、增加、查询、删除和修改(CRUD)操作,以及.xml文件在SQL映射中的作用。 首先,Ibatis是一个轻量级的Java ORM(对象关系映射)框架,它的核心理念是将SQL语句与...

    ibatis实现CRUD操作

    Ibatis通过XML或注解方式定义和配置SQL映射,将Java对象和数据库记录进行映射,实现了数据的CRUD操作。 在实现CRUD操作时,Ibatis有以下核心组件: 1. SQL Map配置文件:这是Ibatis的核心,用于存放SQL语句及其...

    IbatisDemo实现基本的CRUD操作

    在Java Web开发中,iBATIS是一个非常流行的持久层框架,它允许开发者将SQL语句直接写在配置文件中,从而简化了数据访问层的实现。本教程将深入讲解如何使用iBATIS来实现基本的CRUD(创建、读取、更新、删除)操作。 ...

    修改ibatis源代码实现物理分页

    因此,我们需要通过修改Ibatis的源代码来实现物理分页,以提高查询效率。 物理分页是直接在数据库层面进行分页,避免了将所有数据加载到内存中的问题。下面我们将详细探讨如何在Ibatis中实现物理分页。 首先,了解...

    ibatis源码,ibatis源码 ibatis源码 ibatis源码

    源码中`org.apache.ibatis.cache.Cache`接口定义了缓存的基本操作,而具体的缓存实现如`org.apache.ibatis.cache.impl.PerpetualCache`则实现了缓存的存储和读取。 通过阅读和理解iBatis的源码,我们可以更深入地...

    ibatis实现的学生信息管理示例

    这个名为“ibatis实现的学生信息管理示例”的项目,旨在帮助初学者理解并掌握如何利用Ibatis来处理数据库操作,如CRUD(创建、读取、更新、删除)学生信息。下面将详细介绍Ibatis框架的基本概念、工作原理以及如何...

    iBATIS教程之快速入门浅析

    iBATIS 是一款轻量级的Java持久层框架,它主要负责对象关系映射(Object-Relational Mapping,简称O/R Mapping),使得开发者可以将关注点集中在业务逻辑上,而无需过多地处理数据库操作的细节。与Hibernate等其他...

    ibatis总结 ibatis ibatis ibatis ibatis

    - `applicationContext.xml`是Spring的主配置文件,它定义了Spring容器中的bean,包括对Struts、Ibatis等其他框架的配置,实现各组件间的依赖注入。 - `codelist.xml`则可能包含了全局共享的bean,如`...

    iBATIS-DAO-2.3.4.726.rar_com.ibatis.dao_iBATIS dao 2_iBatis DAO_

    此外,iBATIS还提供了一些辅助工具,如`ParameterMap`用于管理SQL语句的输入参数,`ResultMap`用于处理查询结果的映射,以及`Cache`机制,用于缓存查询结果,提高系统性能。这些工具类使得开发者能够更方便地进行...

Global site tag (gtag.js) - Google Analytics