ibatis缓存机制cacheModel

cachemodel是ibatis里面自带的缓存机制,正确的应用能很好提升我们系统的性能。

使用方法:在sqlmap的配置文件中加入

<cacheModel type="LRU" id="vclass_cache" readOnly="true" serialize="false">
            <flushInterval hours="24"/>
            <flushOnExecute statement="insertVclass"/>
            <flushOnExecute statement="batchInsertVclass"/>
            <flushOnExecute statement="removeVclass"/>
            <property name="cache_size" value="50"/>
    </cacheModel>

在查询语句中使用缓存

 <select id="getVclassList" parameterClass="com.wizincloud.vclass.model.Vclass" resultClass="com.wizincloud.vclass.model.Vclass" cacheModel="vclass_cache">
        SELECT * FROM vclass
            <include refid="getVclassList_body" />
            order by created_at  desc
        <dynamic prepend="">
                <isNotNull property="rowNumStart">
                    <isNotNull property="pageSize">
                        LIMIT #rowNumStart#,#pageSize#
                    </isNotNull>
                </isNotNull>
            </dynamic>
    </select>

cacheModel 用在count语句中没有作用。

先对cachemodel中一些用法进行解释一下:

type:是缓存的类型,ibatis中有4种方式,分别为MEMORY、LRU、FIFO、OSCACHE

      MEMORY是内存缓存,和Java内存管理机制类似分为[SOFT、WEAK、STRONG]

      LRU是使用最近最少使用策略

      FIFO是使用先进先出策略

      OSCACHE是通过第三方的缓存插件实现

id:是cachemodel的一个标识

readOnly:指缓存的数据对象是只读还是可读写,默认只读,这里的只读并不是意味着数据对象一旦放入缓存中就无法再对数据进行修改。而是当数据对象发生变化的时候,如数据对象的某个属性发生了变化,则此数据对象就将被从缓存中废除,下次需要重新从数据库读取数据,构造新的数据对象。而readOnly=”false”则意味着缓存中的数据对象可更新.

serialize:只有在readOnly为false的情况下才生效,因为在readOnly为true时,所有数据对象相同,只有可读写时,才会出现不同的session拥有不同的数据对象副本。

flushInterval:指定缓存自动刷新的时间,可以为hours,minutes,seconds,milliseconds.

flushOnExecute:指定在发生哪些操作时,更新缓存。

property:不同type的cachemodel有不同的属性。

(1)当readOnly=true ,serialize=false,只指定insert更新缓存时,我在update一个article的属性后,发现之前的相同的查询条件查询结果是缓存的内容,没取到更新的结果;当我改变查询条件时,出现了更新的结果。由此可见当readonly=true,查询条件不变时,即使发生更新,缓存仍然有效;而查询条件变更时,缓存失效,用新的sql去数据库查询。当发生insert操作时,不管查询条件是否变化,都重新去数据库查询,缓存被更新。

(2)当readOnly=false,serialize=false,只指定insert更新缓存时,update一个article属性后,缓存失效,重新去数据库查询

综上来看,对更新比较频繁的数据,使不使用感觉效率差不多,对更新不是很频繁的数据,使用缓存效率还是能提升的!

实验结果:

第一次执行查询:

2015-08-18 10:10:05,259 DEBUG [java.sql.Connection,27] - {conn-100020} Connection
2015-08-18 10:10:05,262 DEBUG [com.ibatis.sqlmap.engine.cache.CacheModel,27] - Cache ‘Vclass.vclass_cache‘: cache miss
2015-08-18 10:10:05,263 DEBUG [java.sql.Connection,27] - {conn-100020} Preparing Statement:          SELECT * FROM vclass                      WHERE                                                                                                                                   wxAccountId=?                                         order by created_at  desc
2015-08-18 10:10:05,265 DEBUG [java.sql.PreparedStatement,27] - {pstm-100021} Executing Statement:          SELECT * FROM vclass                      WHERE                                                                                                                                   wxAccountId=?                                         order by created_at  desc
2015-08-18 10:10:05,265 DEBUG [java.sql.PreparedStatement,27] - {pstm-100021} Parameters: [2]
2015-08-18 10:10:05,266 DEBUG [java.sql.PreparedStatement,27] - {pstm-100021} Types: [java.lang.Integer]
2015-08-18 10:10:05,275 DEBUG [java.sql.ResultSet,27] - {rset-100022} ResultSet
2015-08-18 10:10:05,278 DEBUG [java.sql.ResultSet,27] - {rset-100022} Header: [id, classname, type, offtime, stu_num, description, status, created_at, updated_at, wxAccountId, userId]
2015-08-18 10:10:05,279 DEBUG [java.sql.ResultSet,27] - {rset-100022} Result: [10, 123123, 0, 2015-08-26 00:00:00.0, 123, <p>123123123</p>, 0, 2015-08-18 00:00:00.0, null, 2, 2]
2015-08-18 10:10:05,280 DEBUG [java.sql.ResultSet,27] - {rset-100022} Result: [9, 招生啦, 0, 2015-08-12 00:00:00.0, 2, <p>阿迪萨斯</p>, 2, 2015-08-12 00:00:00.0, null, 2, 2]
2015-08-18 10:10:05,280 DEBUG [com.ibatis.sqlmap.engine.cache.CacheModel,27] - Cache ‘Vclass.vclass_cache‘: stored object ‘[[email protected], [email protected]]‘
2015-08-18 10:10:05,316 DEBUG [java.sql.Connection,27] - {conn-100023} Connection
2015-08-18 10:10:05,317 DEBUG [java.sql.Connection,27] - {conn-100023} Preparing Statement:          SELECT COUNT(*) FROM vclass_enroll                      WHERE                                        vclass_id=?
2015-08-18 10:10:05,318 DEBUG [java.sql.PreparedStatement,27] - {pstm-100024} Executing Statement:          SELECT COUNT(*) FROM vclass_enroll                      WHERE                                        vclass_id=?
2015-08-18 10:10:05,319 DEBUG [java.sql.PreparedStatement,27] - {pstm-100024} Parameters: [10]
2015-08-18 10:10:05,320 DEBUG [java.sql.PreparedStatement,27] - {pstm-100024} Types: [java.lang.Integer]
2015-08-18 10:10:05,330 DEBUG [java.sql.ResultSet,27] - {rset-100025} ResultSet
2015-08-18 10:10:05,331 DEBUG [java.sql.ResultSet,27] - {rset-100025} Header: [COUNT(*)]
2015-08-18 10:10:05,332 DEBUG [java.sql.ResultSet,27] - {rset-100025} Result: [0]
2015-08-18 10:10:05,355 DEBUG [java.sql.Connection,27] - {conn-100026} Connection
2015-08-18 10:10:05,356 DEBUG [java.sql.Connection,27] - {conn-100026} Preparing Statement:          SELECT COUNT(*) FROM vclass_enroll                      WHERE                                        vclass_id=?
2015-08-18 10:10:05,356 DEBUG [java.sql.PreparedStatement,27] - {pstm-100027} Executing Statement:          SELECT COUNT(*) FROM vclass_enroll                      WHERE                                        vclass_id=?
2015-08-18 10:10:05,357 DEBUG [java.sql.PreparedStatement,27] - {pstm-100027} Parameters: [9]
2015-08-18 10:10:05,357 DEBUG [java.sql.PreparedStatement,27] - {pstm-100027} Types: [java.lang.Integer]
2015-08-18 10:10:05,365 DEBUG [java.sql.ResultSet,27] - {rset-100028} ResultSet
2015-08-18 10:10:05,366 DEBUG [java.sql.ResultSet,27] - {rset-100028} Header: [COUNT(*)]
2015-08-18 10:10:05,366 DEBUG [java.sql.ResultSet,27] - {rset-100028} Result: [0]
2015-08-18 10:10:05,393 DEBUG [java.sql.Connection,27] - {conn-100029} Connection
2015-08-18 10:10:05,394 DEBUG [com.ibatis.sqlmap.engine.cache.CacheModel,27] - Cache ‘Vclass.vclass_cache‘: cache miss
2015-08-18 10:10:05,394 DEBUG [java.sql.Connection,27] - {conn-100029} Preparing Statement:          SELECT COUNT(*) FROM vclass                      WHERE                                                                                                                                   wxAccountId=?
2015-08-18 10:10:05,394 DEBUG [java.sql.PreparedStatement,27] - {pstm-100030} Executing Statement:          SELECT COUNT(*) FROM vclass                      WHERE                                                                                                                                   wxAccountId=?
2015-08-18 10:10:05,395 DEBUG [java.sql.PreparedStatement,27] - {pstm-100030} Parameters: [2]
2015-08-18 10:10:05,395 DEBUG [java.sql.PreparedStatement,27] - {pstm-100030} Types: [java.lang.Integer]
2015-08-18 10:10:05,404 DEBUG [java.sql.ResultSet,27] - {rset-100031} ResultSet
2015-08-18 10:10:05,405 DEBUG [java.sql.ResultSet,27] - {rset-100031} Header: [COUNT(*)]
2015-08-18 10:10:05,405 DEBUG [java.sql.ResultSet,27] - {rset-100031} Result: [2]
2015-08-18 10:10:05,405 DEBUG [com.ibatis.sqlmap.engine.cache.CacheModel,27] - Cache ‘Vclass.vclass_cache‘: stored object ‘2‘

第二次执行查询:

2015-08-18 10:10:20,985 DEBUG [java.sql.Connection,27] - {conn-100032} Connection
2015-08-18 10:10:20,986 DEBUG [com.ibatis.sqlmap.engine.cache.CacheModel,27] - Cache ‘Vclass.vclass_cache‘: retrieved object ‘[[email protected], [email protected]]‘
2015-08-18 10:10:21,014 DEBUG [java.sql.Connection,27] - {conn-100033} Connection
2015-08-18 10:10:21,015 DEBUG [java.sql.Connection,27] - {conn-100033} Preparing Statement:          SELECT COUNT(*) FROM vclass_enroll                      WHERE                                        vclass_id=?
2015-08-18 10:10:21,015 DEBUG [java.sql.PreparedStatement,27] - {pstm-100034} Executing Statement:          SELECT COUNT(*) FROM vclass_enroll                      WHERE                                        vclass_id=?
2015-08-18 10:10:21,016 DEBUG [java.sql.PreparedStatement,27] - {pstm-100034} Parameters: [10]
2015-08-18 10:10:21,016 DEBUG [java.sql.PreparedStatement,27] - {pstm-100034} Types: [java.lang.Integer]
2015-08-18 10:10:21,025 DEBUG [java.sql.ResultSet,27] - {rset-100035} ResultSet
2015-08-18 10:10:21,027 DEBUG [java.sql.ResultSet,27] - {rset-100035} Header: [COUNT(*)]
2015-08-18 10:10:21,028 DEBUG [java.sql.ResultSet,27] - {rset-100035} Result: [0]
2015-08-18 10:10:21,058 DEBUG [java.sql.Connection,27] - {conn-100036} Connection
2015-08-18 10:10:21,060 DEBUG [java.sql.Connection,27] - {conn-100036} Preparing Statement:          SELECT COUNT(*) FROM vclass_enroll                      WHERE                                        vclass_id=?
2015-08-18 10:10:21,061 DEBUG [java.sql.PreparedStatement,27] - {pstm-100037} Executing Statement:          SELECT COUNT(*) FROM vclass_enroll                      WHERE                                        vclass_id=?
2015-08-18 10:10:21,061 DEBUG [java.sql.PreparedStatement,27] - {pstm-100037} Parameters: [9]
2015-08-18 10:10:21,062 DEBUG [java.sql.PreparedStatement,27] - {pstm-100037} Types: [java.lang.Integer]
2015-08-18 10:10:21,072 DEBUG [java.sql.ResultSet,27] - {rset-100038} ResultSet
2015-08-18 10:10:21,074 DEBUG [java.sql.ResultSet,27] - {rset-100038} Header: [COUNT(*)]
2015-08-18 10:10:21,075 DEBUG [java.sql.ResultSet,27] - {rset-100038} Result: [0]
2015-08-18 10:10:21,104 DEBUG [java.sql.Connection,27] - {conn-100039} Connection
2015-08-18 10:10:21,105 DEBUG [com.ibatis.sqlmap.engine.cache.CacheModel,27] - Cache ‘Vclass.vclass_cache‘: retrieved object ‘2‘

明显第一次后的查询,少了select * 语句,从缓存中获取数据。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-13 11:09:32

ibatis缓存机制cacheModel的相关文章

ibatis缓存初探(1)

一,IBATIS 缓存机制使用 1,sqlMapConfig.xml中配置 1.SqlMapConfig.xml中 <settings cacheModelsEnabled="true" //设置为true enhancementEnabled="true" lazyLoadingEnabled="true" ............. /> 注意点,k,必须配置settings这个标签,否则 Xml代码 cacheModelsEna

ibatis的缓存机制

Cache        在特定硬件基础上(同时假设系统不存在设计上的缺漏和糟糕低效的SQL 语句)Cache往往是提升系统性能的最关键因素).        相对Hibernate 等封装较为严密的ORM 实现而言(因为对数据对象的操作实现了较为严密的封装,可以保证其作用范围内的缓存同步,而ibatis 提供的是半封闭的封装实现,因此对缓存的操作难以做到完全的自动化同步).        ibatis 的缓存机制使用必须特别谨慎.特别是flushOnExecute 的设定,需要考虑到所有可能引

针对增量请求的缓存机制实现 - AOP

背景: 在web应用中,我们经常使用黑白名单,在http://blog.csdn.net/troy__/article/details/39320699中我们实现了一个线程安全的针对全量请求的缓存机制,这种技术主要是用于黑白名单的全量更新.但是我们不能经常请求全量吧,网络和数据库都会累死,所以在此我们设计实现一个针对增量请求的缓存机制.全量请求提供黑白名单低频度的更新,增量请求提供黑白名单高频度的更新.当然,全量和增量的应用场景也并不只是黑白名单. 设计概述: 使用缓存的关键之一是:缓存并不能保

MyBatis学习手记(二)MyBatis缓存机制

MyBatis学习手记二 前:MyBatis官方学习(中文)文档 http://mybatis.github.io/mybatis-3/zh/index.html 一,首先,要使用MyBatis必须使用官方提供的MyBatis的JAR包              链接:https://github.com/mybatis/mybatis-3/releases 这里使用的数据库是MySQL,所以还需要Mysql的驱动包. 二,看MyBatis官方介绍,说MyBatis支持一级缓存,二级缓存.这里才

针对增量请求的缓存机制实现

背景: 在web应用中,我们经常使用黑白名单,在http://blog.csdn.net/troy__/article/details/39320699中我们实现了一个线程安全的针对全量请求的缓存机制,这种技术主要是用于黑白名单的全量更新.但是我们不能经常请求全量吧,网络和数据库都会累死,所以在此我们设计实现一个针对增量请求的缓存机制.全量请求提供黑白名单低频度的更新,增量请求提供黑白名单高频度的更新.当然,全量和增量的应用场景也并不只是黑白名单. 设计概述: 使用缓存的关键之一是:缓存并不能保

《深入理解mybatis原理》 MyBatis缓存机制的设计与实现

本文主要讲解MyBatis非常棒的缓存机制的设计原理,给读者们介绍一下MyBatis的缓存机制的轮廓,然后会分别针对缓存机制中的方方面面展开讨论. MyBatis将数据缓存设计成两级结构,分为一级缓存.二级缓存: 一级缓存是Session会话级别的缓存,位于表示一次数据库会话的SqlSession对象之中,又被称之为本地缓存.一级缓存是MyBatis内部实现的一个特性,用户不能配置,默认情况下自动支持的缓存,用户没有定制它的权利(不过这也不是绝对的,可以通过开发插件对它进行修改): 二级缓存是A

Spring(五)Spring缓存机制与Redis的结合

一.Redis和数据库的结合 使用Redis可以优化性能,但是存在Redis的数据和数据库同步的问题. 例如,T1时刻以将 key1 保存数据到 Redis,T2时刻刷新进入数据库,但是T3时刻发生了其他业务需要改变数据库同一条记录的数据,但是采用了 key2 保存到Redis中,然后又写入了更新数据到数据库中,这就导致 Redis 中key1 的数据是脏数据,和数据库中的数据不一致. 1.Redis和数据库读操作 数据缓存往往会在 Redis 上设置超时时间,当设置 Redis 的数据超时后,

《深入理解mybatis原理4》 MyBatis缓存机制的设计与实现

<深入理解mybatis原理> MyBatis缓存机制的设计与实现 本文主要讲解MyBatis非常棒的缓存机制的设计原理,给读者们介绍一下MyBatis的缓存机制的轮廓,然后会分别针对缓存机制中的方方面面展开讨论. MyBatis将数据缓存设计成两级结构,分为一级缓存.二级缓存:   一级缓存是Session会话级别的缓存,位于表示一次数据库会话的SqlSession对象之中,又被称之为本地缓存.一级缓存是MyBatis内部实现的一个特性,用户不能配置,默认情况下自动支持的缓存,用户没有定制它

浏览器缓存机制浅析

非HTTP协议定义的缓存机制 浏览器缓存机制,其实主要就是HTTP协议定义的缓存机制(如: Expires: Cache-control等).但是也有非HTTP协议定义的缓存机制,如使用HTML Meta 标签,Web开发者可以在HTML页面的<head>节点中加入<meta>标签,代码如下: <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> 上述代码的作用是告诉浏览器当前页面不被缓存,每