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

ibatis缓存的简单使用和源码分析

阅读更多

配置:

    <cacheModel type="LRU" id="user-cache">

        <flushInterval hours="24"/>

        <flushOnExecute statement="user.addUser"/>

        <flushOnExecute statement="user.updateUser"/>

        <flushOnExecute statement="user.deleteUser"/>

        <property name="cache-size" value="50000"/>

    </cacheModel>

 

    <select id="getAll" resultClass="user" parameterClass="java.util.HashMap" cacheModel="user-cache">

        select * from user limit 0,#size#

    </select>

 

测试代码:

        Map<String, Object> map = new HashMap<String, Object>();

        map.put("size", 8);

        // first time no cache

        Long startTime = System.currentTimeMillis();

        List<User> list = (List<User>)sqlMap.queryForList("user.getAll", map);

        System.out.println("No cache pass time:" + (System.currentTimeMillis() - startTime));

        // second time has cache

        map.put("size", 8);

        startTime = System.currentTimeMillis();

        list = (List<User>)sqlMap.queryForList("user.getAll", map);

        System.out.println("Has cache pass time:" + (System.currentTimeMillis() - startTime));

 

结果:

No cache pass time:485

Has cache pass time:0

打开ibatis的日志,会发现第二次执行没有sql语句输出。

 

注意:

CacheModel缓存的是statement,即key是跟sql语句相关,如果sql语句不一样,将产生两个cache,如第二条将使用不到缓存,但第三条可以使用缓存:

select * from user limit 0,4    新建缓存

select * from user limit 0,8    新建缓存

select * from user limit 0,8    使用缓存

 

简单源码分析:

queryForList为例:

 

SqlMapExecutorDelegate具体实现:

list = ms.executeQueryForList(statementScope, trans, paramObject, skip, max);

这里msMappedStatement,其中CachingStatement是它的子类。

 

CachingStatement具体实现:

  public List executeQueryForList(StatementScope statementScope, Transaction trans, Object parameterObject, int skipResults, int maxResults)

      throws SQLException {

    CacheKey cacheKey = getCacheKey(statementScope, parameterObject);

    cacheKey.update("executeQueryForList");

    cacheKey.update(skipResults);

    cacheKey.update(maxResults);

    Object listAsObject = cacheModel.getObject(cacheKey);

    List list;

    if(listAsObject == CacheModel.NULL_OBJECT){

      // The cached object was null

      list = null;

    }else if (listAsObject == null) {

      list = statement.executeQueryForList(statementScope, trans, parameterObject, skipResults, maxResults);

      cacheModel.putObject(cacheKey, list);

    }else{

      list = (List) listAsObject;

    }

    return list;

  }

 

0
1
分享到:
评论

相关推荐

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

    本文将通过分析iBatis的源码,深入探讨其设计理念和实现机制。 一、iBatis架构概述 iBatis主要由SqlMapConfig.xml配置文件、SqlMap接口和Executor执行器三大部分构成。SqlMapConfig.xml配置文件定义了数据源、事务...

    iBATIS框架源码剖析源码

    通过深入分析iBATIS的源码,开发者不仅可以了解其工作原理,还能学习到设计模式、数据库访问的最佳实践以及如何优雅地处理数据库操作。对于提升Java开发者的技能和理解数据库访问层的实现有极大的帮助。在实际开发中...

    ibatis源码

    描述中的"ibatis框架源码剖析书中附带的光盘,ibatis源码分析"暗示这可能是一个学习资源,用于深入理解iBATIS的工作原理,可能包括了对源码的详细解读和分析。 **iBATIS核心知识点** 1. **SQL映射**:iBATIS的核心...

    ibatis源码+api文档+jar包

    接下来,关于源码分析: 1. 源码阅读:源码中包含Ibatis的所有核心组件,如SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession等。通过阅读源码,可以深入了解其工作原理,例如如何加载配置文件、如何创建和...

    iBATIS入门讲解和程序源码+iBATIS开发指南电子书

    源码分析部分,我们可以看到iBATIS如何解析XML配置文件,如何通过反射机制调用Java方法,以及如何将查询结果自动映射到Java对象上。这对于理解iBATIS的工作流程及其内部机制至关重要。 在"iBATIS开发指南电子书"中...

    ibatis2.3源码

    3. **Executor**:执行器是iBATIS的核心组件,负责处理SQL的执行,包括简单执行、批量执行和缓存管理。 4. **ParameterMapping**和**ResultMapping**:这两个概念定义了如何将Java对象的属性与SQL语句中的参数和...

    ibatis memcached 整合 源码 文档

    本文将详细讲解如何将iBatis与Memcached整合,以及相关的源码分析和文档资料。 首先,我们需要了解iBatis和Memcached的基本概念。iBatis允许开发者将SQL语句直接写在配置文件中,通过Java接口和XML映射文件将数据层...

    ibatis2.3-src

    《深入解析iBatis 2.3源码》 iBatis,作为一款经典的Java持久层框架,以其轻量级、灵活的特性深受开发者喜爱。...在实际项目中,结合源码分析,能够更好地定制和扩展iBatis,满足特定的业务需求。

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

    总的来说,iBATIS DAO 2.3.4.726版的源码分析对于学习和理解Java中的持久层设计有极大的帮助。通过阅读和理解源码,开发者不仅能掌握iBATIS DAO的基本使用,还能深入了解其内部实现,提升数据库操作的技巧和优化能力...

    传智ibatis视频源码

    9. **缓存机制**:Ibatis提供了本地缓存和二级缓存,学习如何配置和使用缓存,可以有效地减少数据库访问,提升应用性能。 通过赖家才老师的源码学习,你可以亲手实践这些知识点,加深理解并掌握Ibatis的精髓。同时...

    ibatis-2.3.3.720.jar

    Ibatis,全称为MyBatis,是一个优秀的Java持久层框架,它主要负责简化数据库操作,使得开发者能够将注意力集中在编写SQL...通过使用这个jar包,开发者可以轻松地集成Ibatis到自己的项目中,享受其带来的便利和优势。

    IBatis源码+xsd+帮助

    一、**IBatis源码分析** IBatis的源码是开源的,这对于开发者来说是一份宝贵的资源,可以让我们深入了解其工作原理和内部机制。通过阅读源码,我们可以学习到以下知识点: 1. **动态SQL**:IBatis的核心功能之一...

    iBatis实战and源代码.zip

    通过分析这个案例,我们可以学习到如何在实际开发中设计和实现SQL映射文件,以及如何在Java代码中调用iBatis接口来执行SQL语句。 此外,源代码部分是学习iBatis的重要资源。通过对源码的学习,我们可以了解iBatis...

    ibatis-sqlMap相关参考

    8. **源码分析**:深入Ibatis源码,理解其执行流程和优化技巧。 9. **工具支持**:了解IDE中对Ibatis的支持,如插件安装和配置,以及如何利用它们提高开发效率。 通过以上知识点的学习,开发者能更好地掌握Ibatis-...

    ibatis分页

    标题中的“ibatis分页”指的是在使用iBATIS(一个SQL映射框架)时,如何实现数据库查询结果的分页显示。...对于进阶学习者,深入源码分析将帮助理解iBATIS的内部工作流程,从而更好地进行定制和优化。

    Ibatis框架三层架构项目源码.rar

    Ibatis框架是一个轻量级的Java持久层框架,它...通过分析源码,开发者能够深入理解Ibatis如何处理数据访问,如何与Web层交互,以及如何组织和管理数据库操作。同时,这样的分层结构也有助于代码的可维护性和扩展性。

    ibatis-2.3.0.677

    《深入解析iBatis 2.3.0.677源码》 ...总之,通过对iBatis 2.3.0.677源码的分析,我们可以掌握其设计理念和工作原理,提升我们在Java持久层开发中的技术水平。无论是初学者还是经验丰富的开发者,都能从中受益匪浅。

    ibatis-2-mybatis-2.3.5.zip

    四、源码分析 iBatis的核心源码中,SqlSessionManager是整个框架的入口,负责创建SqlSession对象并管理事务。Executor接口及其实现类(SimpleExecutor、ReuseExecutor、BatchExecutor)是执行SQL的关键。在执行SQL...

    ibatis-2.3.4.726-src-源代码

    通过深入学习和分析iBatis 2.3.4.726的源代码,开发者可以更好地理解其工作原理,从而优化SQL执行效率,解决框架使用中遇到的问题,提升开发效率。同时,这也为转向MyBatis的学习提供了坚实的基础。

Global site tag (gtag.js) - Google Analytics