0 0

ibatis的缓存机制5

我现在遇到了一个问题
在sqlMap-config.xml里面配置的文件是<select id="getValue" parameterClass="java.lang.String" resultClass="java.util.HashMap" remapResults="true">

<![CDATA[
    select $str$ from student
]]>
</select>
对应的方法是/**
* 获取数据库中字段内容的查询
* */
public List<Map<String,Object>> getElement(String seq_str){
List<Map<String,Object>> result = new ArrayList<Map<String,Object>>();
result = baseDao.selectObjects("getElment", seq_str);
return result;
}
第一次我传进去的参数$str$是“id,name”则result得到的元素顺序是:“123,李四”第二次我传进去的参数$str$是“name,id”则result得到的元素顺序是"123,李四"也就是第二结果和第一次结果的顺序相同,我认为是ibatis自带的缓存的问题,所以会自动保留第一次结果的顺序。请大侠给出高解,在此非常感谢。
2012年8月06日 15:51

4个答案 按时间排序 按投票排序

0 0

采纳的答案

你可以试试这个解决办法,

resultClass="java.util.HashMap"

改成

resultClass="java.util.LinkedHashMap"

应该能达到你想要的效果。

我只是不理解这个需求,哈。

2012年8月06日 22:52
0 0

remapResults="true" 这个属性改为false试试

2012年8月07日 11:33
0 0

看了一下mybatis3.0.6的源码,你的猜测是不对的。
BaseExecutor的query()源码如下:

  public List query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException {
    ErrorContext.instance().resource(ms.getResource()).activity("executing a query").object(ms.getId());
    if (closed) throw new ExecutorException("Executor was closed.");

    // Flush the internal cache is force is true
    if (ms.isFlushCacheRequired()) {
        clearLocalCache();
    }
    List list;
    try {
      queryStack++;
      CacheKey key = createCacheKey(ms, parameter, rowBounds); //创建缓存key
      list = resultHandler == null ? (List) localCache.getObject(key) : null; //默认首先从缓存读取数据
      if (list != null) {
        handleLocallyCachedOutputParameters(ms, key, parameter);
      } else {
        list = queryFromDatabase(ms, parameter, rowBounds, resultHandler, key); // 该方法中会将数据写入缓存
      }
    } finally {
      queryStack--;
    }
    if (queryStack == 0) {
      for (DeferredLoad deferredLoad : deferredLoads) {
        deferredLoad.load();
      }
    }
    return list;
  }

可以看到,如果传入的参数是$str$,它会做简单参数替换,由于两次的sql语句不相同,两次生成的CacheKey也是不相同的,缓存不生效。如果传入的参数是#{str},那么sql语句相同(都是使用?替换),所以缓存生效,可以解释上面的情况。
所以,如果按照你的描述,应该不是缓存的原因,具体原因我后面再debug一下源码。

2012年8月06日 18:39
0 0

iBatis好久没有用过了。试试看猜的对不对,哈。

引用
resultClass="java.util.HashMap"

你设置的结果是HashMap,所以每次返回值应该都是

result =[{id=123, name=李四}, {id=456, name=张三}, ...]

类似这样的,无论你传进去是“id,name”,“name,id”都是一样的。

简单的说,就是HashMap里面的元素顺序和你定义的Key的顺序无关。(和Key值的HasdCode值来着?记不清了。)

2012年8月06日 17:09

相关推荐

    iBATIS缓存介绍

    ### iBATIS缓存介绍 #### 一、缓存知识介绍 ##### 1.1 缓存对象 理论上,Web分层设计的各个层都可以有缓存,Web中的任何对象都可以成为缓存的对象。例如: - **HTTP请求结果的缓存**:包括浏览器缓存、代理缓存...

    iBATIS缓存介绍[借鉴].pdf

    通过上述介绍,我们可以看到iBATIS缓存机制是其性能优化的关键组成部分,通过合理的配置和选择合适的缓存策略,可以显著提升系统的响应速度和整体性能。在实际开发中,理解并掌握这些概念和配置方法,对于优化iBATIS...

    iBATIS缓存

    iBATIS的缓存机制不仅限于简单的数据存储,还支持基于查询条件的缓存。通过设置`flushCache="true"`,可以在某些操作(如插入、更新或删除)后强制清空相应的一级或二级缓存,确保缓存中的数据与数据库保持同步。 ...

    解决IBatis缓存动态字段问题

    这种情况下,由于IBatis的缓存机制,可能导致字段找不到的问题。具体表现为:当第一次查询某个表时,IBatis会将查询结果中的字段名缓存起来;而在后续查询其他表时,如果这些表的字段与之前缓存的字段不一致,就会...

    iBATIS缓存的使用方法

    ### iBATIS缓存的使用方法 在数据库访问框架iBATIS中,缓存机制是一项重要的功能,它能够显著提高应用程序的性能。本文将详细介绍iBATIS中的缓存使用方法,包括缓存模型的配置、不同类型的缓存控制器以及如何在SQL...

    ibatis 缓存配置策略

    iBatis 提供了本地缓存机制,用于存储查询结果集,减少不必要的数据库访问。以下是对iBatis缓存配置策略的深入解析: 首先,iBatis 的 Cache 键(key)是由多个因素组成的,包括对象的hashCode、checksum、查询参数...

    Java ibatis缓存技术

    ### Java ibatis缓存技术详解 #### 一、ibatis缓存概述 ibatis是一款流行的持久层框架,它简化了Java应用程序与数据库之间的交互过程。ibatis提供了多种特性,其中包括缓存机制,这对于提高应用程序的性能至关重要...

    ibatis-缓存使用示例

    总之,iBATIS缓存是提升系统效率的关键技术之一,理解其工作机制并恰当运用,对于构建高效、稳定的应用至关重要。通过"ibatis-缓存使用示例"的学习,开发者能更好地掌握这一技巧,从而在实际项目中发挥出更大的价值...

    ibatis培训教程

    - **iBATIS缓存机制**: - 一级缓存: 自动启用,存储在会话级别,用于存储SQL执行的结果。 - 二级缓存: 需要手动启用,存储在映射文件级别,可以在多个会话之间共享数据。 - **缓存配置**: - 在`SqlMapConfig.xml`...

    Java_ibatis缓存技术

    本文将深入探讨Java_iBatis缓存技术,包括它的概念、类型、配置以及在实际应用中的注意事项。 首先,缓存是一种存储机制,用于临时存放频繁访问的数据,减少数据库的读取次数,从而提高系统响应速度。在iBatis中,...

    ibatis开发手册

    #### 四、ibatis缓存机制 - **MEMORY类型Cache与WeakReference**: - 内存级别的缓存,使用WeakReference可以避免内存泄漏的风险。 - **LRU型Cache**:Least Recently Used,最近最少使用的缓存策略,当缓存满时,...

    J2EE WEB缓存技术详解.doc

    **ibatis缓存机制** - ibatis(现MyBatis)框架也提供了缓存机制,包括一级缓存(本地缓存,类似于JCS的内存区域)和二级缓存(跨SQL会话的缓存,类似JCS的磁盘区域或远程区域)。这表明,缓存机制是提高数据访问...

    ibatis_数据缓存

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

    ibatis demo,ibatis例子,ibatis示例

    7. **缓存机制**:Ibatis内置了本地缓存和二级缓存,可以提高数据读取速度。本地缓存作用于单个SqlSession,而二级缓存则可以在多个SqlSession之间共享,但需要注意并发控制和数据一致性问题。 8. **插件支持**:...

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

    十、缓存机制 iBatis提供了本地缓存和二级缓存,通过CachingExecutor实现。缓存策略可以在全局配置文件中配置,也可以在每个Mapper中单独设置。源码中`org.apache.ibatis.cache.Cache`接口定义了缓存的基本操作,而...

    ibatisDemo.zip

    5. **缓存机制**:Ibatis内置了本地缓存和二级缓存,能够提高数据读取速度,减少数据库压力。 接下来,我们来看看压缩包中的"ibatisDemo"可能包含的内容: - **CRUD示例**:这通常是一系列的Java类和XML配置文件,...

    ibatis开发指南 经典教材

    为了提高查询性能,ibatis内置了多种缓存机制,包括`MEMORY`类型缓存、`LRU`(Least Recently Used)型缓存、`FIFO`(First In First Out)型缓存和`OSCache`。其中,`MEMORY`类型缓存使用弱引用(WeakReference)来...

    ibatis api,ibatis文档,ibatis说明文档

    6. 缓存:Ibatis提供了本地缓存和二级缓存机制,有助于提高性能。 7. 执行性能:提供优化建议,如批处理、缓存使用等,以提升应用程序的运行效率。 总之,Ibatis是一个强大且灵活的Java持久层框架,其API、文档和...

Global site tag (gtag.js) - Google Analytics