`

ibatis的缓存中计算cachekey的过程

阅读更多

CachingStatement在执行查询的时候,会先从CacheModel中获取结果。如果结果为空,则执行查询并将结果保存在CacheModel中。在读写CacheModel的过程中,都需要获得CacheKey对象,以CacheKey作为缓存的key。下面是获得CacheKey的过程:

 

 

CachingStatement
public CacheKey getCacheKey(StatementScope statementScope, Object parameterObject) {
//调用了MappedStatement的getCacheKey
    CacheKey key = statement.getCacheKey(statementScope, parameterObject);
//如果cacheModel不是只读的而且不是可序列化的,则将当前的session信息作为CacheKey的一部分 
   if (!cacheModel.isReadOnly() && !cacheModel.isSerialize()) {
      key.update(statementScope.getSession());
    }
    return key;
  }

 

 

MappedStatement中获得CacheKey的时候使用了几个因素:sql语句的id,baseCacheKey和sql语句本身

sdf

 

MappedStatement
public CacheKey getCacheKey(StatementScope statementScope, Object parameterObject) {
    Sql sql = statementScope.getSql();
    ParameterMap pmap = sql.getParameterMap(statementScope, parameterObject);
//调用ParameterMap的方法
    CacheKey cacheKey = pmap.getCacheKey(statementScope, parameterObject);
    cacheKey.update(id);
    cacheKey.update(baseCacheKey);
    cacheKey.update(sql.getSql(statementScope, parameterObject)); //Fixes bug 953001
    return cacheKey;
  }

 

 

 

ParameterMap
 public CacheKey getCacheKey(StatementScope statementScope, Object parameterObject) {
    return dataExchange.getCacheKey(statementScope, this, parameterObject);
  }

 

 

BaseDataExchange中 调用了PrimitiveDataExchange的getData,用getData得到的数组来更新key,也就是使用这次sql调用的参数值来更新key。

 

BaseDataExchange
public CacheKey getCacheKey(StatementScope statementScope, ParameterMap parameterMap, Object parameterObject) {
    CacheKey key = new CacheKey();
    Object[] data = getData(statementScope, parameterMap, parameterObject);
    for (int i = 0; i < data.length; i++) {
      if (data[i] != null) {
        key.update(data[i]);
      }
    }
    return key;
  }

 PrimitiveDataExchange从ParameterMap中获得参数的个数,创建对象数组data,将parameterObject付给数组的每个元素。

 

 

PrimitiveDataExchange
 public Object[] getData(StatementScope statementScope, ParameterMap parameterMap, Object parameterObject) {
    ParameterMapping[] mappings = parameterMap.getParameterMappings();
    Object[] data = new Object[mappings.length];
    for (int i = 0; i < mappings.length; i++) {
      data[i] = parameterObject;
    }
    return data;
  }

 

CacheKey的update方法,增加参数计数值,修改checksum和baseHashCode,使用参数的hashcode值和caseHashCode来更新当前cachekey的hashcode

 

CacheKey
  public CacheKey update(Object object) {
    int baseHashCode = object.hashCode();

    count++;
    checksum += baseHashCode;
    baseHashCode *= count;

    hashcode = multiplier * hashcode + baseHashCode;

    paramList.add(object);

    return this;
  }

 

 

综上所述,计算cachekey的因素包括baseHashCode,sql语句的id,sql语句本身和每次调用传入的sql参数值。如果cacheModel不是只读的而且不是可序列化的,则将当前的session信息也作为CacheKey的一部分。

分享到:
评论

相关推荐

    iBATIS缓存

    **iBATIS缓存**是数据库访问框架iBATIS中的一个重要特性,用于提高数据查询的效率,减少不必要的数据库访问。iBATIS缓存分为一级缓存和二级缓存,它们在提升应用程序性能方面起着关键作用。 一级缓存是SqlSession...

    解决IBatis缓存动态字段问题

    ### 解决IBatis缓存动态字段问题 #### 背景与问题描述 在使用IBatis框架处理数据库操作时,...同时,需要注意的是,在实际开发过程中还需要结合具体的业务需求来制定更合理的缓存策略,以提高应用程序的整体性能。

    iBATIS缓存介绍

    - **3.5.2 如何手工强制清除iBATIS高速缓存中保存的对象** - 可以通过调用`clearCache()`方法来实现。 - **3.5.3 OSCACHE基本使用及配置项说明** - OSCACHE利用操作系统的缓存机制,提供更高的性能。 - 配置项...

    iBATIS缓存的使用方法

    本文将详细介绍iBATIS中的缓存使用方法,包括缓存模型的配置、不同类型的缓存控制器以及如何在SQL映射文件中应用这些缓存设置。 #### 一、缓存的基本概念 缓存是存储数据的一种临时区域,目的是减少重复查询数据库...

    ibatis缓存介绍 - 勇泽 - 博客园.mht

    ibatis缓存介绍 - 勇泽 - 博客园ibatis缓存介绍 - 勇泽 - 博客园ibatis缓存介绍 - 勇泽 - 博客园ibatis缓存介绍 - 勇泽 - 博客园

    ibatis-缓存使用示例

    在"Test_ibatis"这个测试文件中,可能包含了演示如何配置和使用iBATIS缓存的代码。通常,这会包括以下步骤: 1. 配置缓存:在Mapper XML文件中,通过`&lt;cache&gt;`元素定义缓存配置,比如设置 eviction(驱逐策略)、...

    Java ibatis缓存技术

    在ibatis中,缓存主要分为一级缓存和二级缓存。一级缓存是默认启用的,它存储在一个执行器中,并且对于每一个会话来说都独立存在。二级缓存则是在更高的级别上进行管理,可以跨多个会话共享数据。本文将重点介绍...

    ibatis 缓存配置策略

    iBatis 缓存配置策略是提高数据库查询性能的关键手段之一。iBatis 提供了本地缓存机制,用于存储查询结果集,减少不必要的数据库访问。以下是对iBatis缓存配置策略的深入解析: 首先,iBatis 的 Cache 键(key)是...

    Java_ibatis缓存技术

    在iBatis中,缓存被划分为一级缓存和二级缓存。 1. **一级缓存**:也称为SqlSession级别的缓存,是默认开启的。当我们在同一个SqlSession中执行相同的SQL查询时,如果第一次查询的结果已经存在于缓存中,那么第二次...

    iBATIS缓存介绍[借鉴].pdf

    iBATIS,作为一个流行的数据访问框架,也提供了缓存功能来优化数据库查询。本文将详细介绍iBATIS缓存的概念、类型以及配置方法。 一.缓存介绍 缓存,简单来说,是为了减少对数据库的频繁访问,将常用数据存储在...

    ibatis 缓存 - 24小时学习网.mht

    ibatis 缓存 - 24小时学习网ibatis 缓存 - 24小时学习网ibatis 缓存 - 24小时学习网ibatis 缓存 - 24小时学习网ibatis 缓存 - 24小时学习网

    ibatis_数据缓存

    iBatis 数据缓存机制是提高数据库访问性能的重要手段,它允许将查询结果存储在内存中,以便后续相同查询能够快速获取数据,而无需每次都执行SQL查询。在深入理解iBatis的Cache概念之前,首先需要知道iBatis是一个轻...

    ibatis官方中文文档

    对于那些想要了解或深入掌握iBATIS,特别是想在实际项目中使用iBATIS存储过程的开发者来说,这是一份非常宝贵的学习资料。 **iBATIS简介** iBATIS(现更名为MyBatis)是一个优秀的Java持久层框架,它简化了数据库...

    ibatis调用oracle存储过程分页

    ibatis调用oracle存储过程分页

    ibatis 数据缓存.pdf

    ibatis 数据缓存,讨论了ibatis 数据缓存方面的概念,即用法,用到ibatis 数据缓存的可以参考一下

    ibatis调用oracle存储过程

    在IT领域,特别是数据库操作与Java开发中,利用ibatis框架调用Oracle存储过程是一个常见的需求,这不仅能够提升代码的执行效率,还能增强应用程序的安全性。本文将深入解析ibatis如何与Oracle数据库中的存储过程进行...

    ibatIS调用存储过程

    ibatIS调用存储过程是数据库操作中常见的一种技术,特别是在复杂的业务逻辑处理或数据批量操作时,存储过程能够提供更高的效率和更好的性能。本文将深入探讨如何在ibatIS框架中调用存储过程,以及涉及到的相关知识点...

    Ibatis调用存储过程调用存储过程

    在Ibatis中,可以通过XML映射文件来定义存储过程的调用。下面是一个具体的例子: ```xml &lt;!-- 存储过程参数映射 --&gt; &lt;!-- 调用存储过程 --&gt; &lt;![CDATA[ {call share_dev_prv_to_person(?,?,?,...

Global site tag (gtag.js) - Google Analytics