使用IBatis作数据缓存

1.SqlMapConfig.xml中
<settings
cacheModelsEnabled="true" //设置为true
enhancementEnabled="true"
lazyLoadingEnabled="true"
.............
/>

2.cacheModel cacheModel的属性值等于指定的cacheModel元素的name属性值。属性cacheModel定义查询mapped statement的缓存。每一个查询mapped statement可以使用不同或相同的cacheModel。详细讨论见后面的章节,以下只给出个例子。
<cacheModel id="product-cache" imlementation="LRU">
<flushInterval hours="24"/>
<flushOnExecute statement="insertProduct"/>
<flushOnExecute statement="updateProduct"/>
<flushOnExecute statement="deleteProduct"/>
<property name=”size” value=”1000” />
</cacheModel>

<statement id=”getProductList” parameterClass=”int” cacheModel=”product-cache”> select * from PRODUCT where PRD_CAT_ID = #value#
</statement>
上面例子中,“getProductList”的缓存使用WEAK引用类型,每24小时刷新一次,或当更新的操作发生时刷新。

关于ibatis补充说明
<cacheModel id="oneday_cache" type="LRU" readOnly="false" serialize="true">
       <flushInterval hours="24"/>
       <flushOnExecute statement="updateMyDate"/>
       <property name="size" value="200"/>
</cacheModel>

1 属性readOnly如果不写,默认是true,这时的缓存效果无疑最好,因为系统不需要考虑更新操作引起缓存与实际数据不一致的问题,只读缓存的例子是固化到数据库中的一些配置参数表。但是,通常我们想缓存的数据是需要增删改的,这时务必记得要加上      readOnly = "false";
2 属性serialize,如果不写,默认为false, 将它设为true,可以提高整体应用(而不仅仅是每个Session)的性能。 这种缓存为每一个Session返回缓存对象不同的实例(复本)。因此每一个Session都可以安全修改返回的对象.    注意,此时readOnly必须为false。
      如果你把它设为 true ,记得检查两件事,一件事是缓存中存放的对象(你想查询的POJO)必须是可序列化的, 即实现Serializable接口。如果你有一个复杂对象属性,它也必须满足这个规则,你的整个对象树必须是可序列化的。
      另一件事是关闭sql-map-config中的延迟加载属性,即lazyload=false,原因是,它使用了动态代理机制, 那个代理对象并不是Serializable的。
   
    缓存类型的最佳适应情形:

MEMORY     没有统一的对象重用模式的应用,或内存不足的应用。
    LRU        在较长的期间内,用户经常使用某些特定对象。
    FIFO       用户在短时间内持续引用特定的查询,而后很可能不再使用。
   
    根据个人实践,内存充足时使用LRU,否则使用MEMORY(WEAK)通常能获得较好的效果。

※《ibatis开发指南》有关于上面几种缓存类型的详细说明。

<cacheModel type="OSCACHE" id="cache">
    <flushInterval hours="24"/>
    <flushOnExecute statement="WapIndex.delete"/>
    <flushOnExecute statement="WapIndex.update"/>
    <property value="100" name="size"/>
</cacheModel>

2007-7-9 11:45:42    IBatis中的强制刷新缓存 目前我们采用IBatis作ORM, 所以我们直接使用了IBatis 自带的缓存解决方案。当然你也可以定制,我在我的一篇文章可复用、扩展的缓存设计方案也谈到了如何定制 ,个人认为如果不是非常复杂的需求,完全可以借助ORM自带的方案.你会发现非常非常简单.

下面我们进入实战:

step1)写ibatis的相关配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-2.dtd">

<sqlMap namespace="specialtopic">

............
     <cacheModel id="getTopVideoListByColumn1-cache" type ="OSCACHE" >
         <flushInterval seconds="60"/>
        
</cacheModel>
    
    
     ............
        
     <statement id="getTopVideoListByColumn1" resultMap="top-Video-column1" cacheModel="getTopVideoListByColumn1-cache">
         select v.videoId,v.title,v.timeSpan,tu.loginName,vr.viewedCount
         from top_baby_video tbv
         inner join video v on tbv.videoId=v.videoId
         inner join video_report vr on v.videoId=vr.videoId  
         inner join tvUser tu on v.tvUserId=tu.tvUserId
     </statement>
    
</sqlMap>
    
显而易见上面的cacheModel是缓存策略, 只需加在statement段的属性中即可

step2)写dao方法
public List getTopVideoListByColumn1 ()...{
         List list = this.getSqlMapClientTemplate().queryForList("getTopVideoListByColumn1",
                 null);
         return list;
     }

就是这么简单,从客户端的角度看,缓存是透明的.你可以从配置文件修改你的缓存策略,不会对你的java代码造成任何影响.

强制刷新缓存的功能,如何实现?马上进入实战:

我们通过一个jsp搞定<%@ page import="xxx.common.utils.SpringBeanProxy"%>
<%@ page import="com.ibatis.sqlmap.client.SqlMapClient"%>
<%
            
    
             String cacheModelId = request.getParameter("cacheModelId");
            
             SqlMapClient client = (SqlMapClient) SpringBeanProxy
                     .getBean("sqlMapClient");
                    
    
             client.flushDataCache(cacheModelId);
%>

ok!
首先我们获取需要刷新缓存的id,然后从spring工厂中取出SqlMapClient ,然后利用SqlMapClient刷新缓存

其实你也可以调用client.flushDataCache(),这样就刷新了所有的缓存模型而不是某一个.

java之ibatis数据缓存的更多相关文章

  1. java实现数据缓存

    摘抄自java并发实战 有时候需要对数据缓存.用Map缓存数据比较合适.但是由于对吞吐量,一致性,计算性能的要求,对数据进行缓存的设计还是需要慎重考虑的. 一.利用HashMap加同步 (1)说明 把 ...

  2. java中使用Ehcache缓存数据

    知识点:在java项目中,使用ehcache缓存数据 参考博客:http://www.cnblogs.com/jingmoxukong/p/5975994.html ()概述 Ehcache是一个纯J ...

  3. Java使用iBatis批量插入数据到Oracle数据库

    Java使用iBatis批量插入数据到Oracle数据库 因为我们的数据跨库(mysql,oracle),单独取数据的话需要遍历好多遍,所以就想着先从mysql数据库中取出来的数据然后在oracle数 ...

  4. java——包装类数据缓存 ==号详解

    Java对部分经常使用的数据采用缓存技术,即第一次使用该数据则创建该数据对象并对其进行缓存, 当再次使用等值对象时直接从缓存中获取,从而提高了程序执行性能.(只对常用数据进行缓存) Java中只是对部 ...

  5. 「小程序JAVA实战」小程序数据缓存API(54)

    转自:https://idig8.com/2018/09/22/xiaochengxujavashizhanxiaochengxushujuhuancunapi52/ 刚开始写小程序的时候,用户信息我 ...

  6. ibatis的缓存机制

    Cache        在特定硬件基础上(同时假设系统不存在设计上的缺漏和糟糕低效的SQL 语句)Cache往往是提升系统性能的最关键因素).        相对Hibernate 等封装较为严密的 ...

  7. 从零开始学 Java - Spring 集成 Memcached 缓存配置(二)

    Memcached 客户端选择 上一篇文章 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)中我们讲到这篇要谈客户端的选择,在 Java 中一般常用的有三个: Memc ...

  8. 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)

    硬盘和内存的作用是什么 硬盘的作用毫无疑问我们大家都清楚,不就是用来存储数据文件的么?如照片.视频.各种文档或等等,肯定也有你喜欢的某位岛国老师的动作片,这个时候无论我们电脑是否关机重启它们永远在那里 ...

  9. jQuery 2.0.3 源码分析 数据缓存

    历史背景: jQuery从1.2.3版本引入数据缓存系统,主要的原因就是早期的事件系统 Dean Edwards 的 ddEvent.js代码 带来的问题: 没有一个系统的缓存机制,它把事件的回调都放 ...

随机推荐

  1. CF293B 方格(带技巧的搜索)

    solution: 首先我们根据一条路径上不能有两个相同颜色的格子可以得出: 对于两个格子 \((x_1 , y_1 )\) 和 \((x_2 , y_2 )\) 必须满足: \(x_1<x_2 ...

  2. shell脚本练习【转】

    1.写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin):分别这两类用户的个数:通过字符串比较来实现: #脚本内容 [root@ce ...

  3. SOAP简单示例

    看了网上的几个文章,SOAP的示例布局都不清晰,不能马上入手,特意写个例子与大家分享,同时记录备用. 当前环境:VS2013 + WPF private void Button_Click(objec ...

  4. 升级Chrome后无法打开网页

    最近升级了网站,发现很多普通网站Chrome 都打不开了....  IE  可以正常打开,很是郁闷,重启电脑都不行. chrome://net-internals/#dns 点击如下按钮 清楚DNS缓 ...

  5. day16作业

    一.填空题 1.Integer Character 2.String s = "123";Integer i = new Integer(s);System.out.println ...

  6. 证书(Certificate)与描述文件(Provisioning Profiles)

    在使用脚本xcodebuild自动打包的时候,会用到签名证书和描述文件,我在编译的时候搞了好长时间才搞明白,下面介绍如何得到正确配置. 证书:证书是用来给应用程序签名的,只有经过签名的应用程序才能保证 ...

  7. GET和POST两种基本请求方法的区别(转载)

    get与post请求的区别: 通常回答: GET在浏览器回退时是无害的,而POST会再次提交请求. GET产生的URL地址可以被Bookmark,而POST不可以. GET请求会被浏览器主动cache ...

  8. java & android 开发规范手册

    阿里巴巴Java开发手册(终极版)https://pan.baidu.com/s/1c1UQM7Q 阿里巴巴Java开发规约插件p3cGitHub:https://github.com/alibaba ...

  9. Scala 学习笔记(1)之入门篇

    Scala is pronounced skah-lah. Scala 全称为 scalable language,是一种面向对象(object)- 函数式(functional)静态类型(stati ...

  10. fis3-postpackager-loader

    静态资源前端加载器,用来分析页面中使用的和依赖的资源(js或css), 并将这些资源做一定的优化后插入页面中.如把零散的文件合并. 注意 此插件做前端硬加载,适用于纯前端项目,不适用有后端 loade ...