SQL Map XML 映射文件除了上文提到的属性还有一些其他重要的属性,下文将详细介绍这些属性。

  • 缓存 Mapped Statement 结果集

    通过在查询 statement 中指定 cacheModel 属性,可以缓存 Mapped Statement 中得到的查 询结果。Cache  model  是在 SQL  Map  XML  文件中定义的可配置缓存模式,可以使用 cacheModel 元素来配置。

     <cacheModel id="product-cache" type ="LRU" readOnly=”true” serialize=”false”>
    <flushInterval hours="24"/>
    <flushOnExecute statement="insertProduct"/>
    <flushOnExecute statement="updateProduct"/>
    <flushOnExecute statement="deleteProduct"/>
    <property name=”cache-size” value=”1000” />
    </cacheModel>

    上面的 cache model 创建了一个名为“product-cache”的缓存,使用“近期最少使用”(LRU) 实现。Implemention 属性的名称要么是全限定的类名,要么是缓存实现的别名(参见下面的 内容)。根据 cacheModel  中 flush  元素的内容,上面的例子每 24  小时刷新一次。一个 cacheModel 只能有一个 flushInteval 元素,它可以使用 hours,minutes,seconds 或 milliseconds 来设定。另外,当 insertProduct,updateProduct 或 deleteProduct 的 Mapped Statement 执行时, 缓存也被刷新。cacheModel 可以定义任意多的 flushOnExecute 元素。某些 cache model 的实 现可能需要另外的属性,如上面的“cache-size”属性。在 LRU cache model 中,cache-size 指定了缓存储存的项数。一旦配置了 cache model,您可以指定 mapped statement 使用的 cache model,例如:

     <statement id=”getProductList” cacheModel=”product-cache”>
    select * from PRODUCT where PRD_CAT_ID = #value#
    </statement>

    只读 VS 可读写

    框架同时支持只读和可读写缓存。只读缓存可供所有用户共享,因此性能更好。但是, 只读缓存的数据不应该被修改。相反,要更新数据,必须从数据库(或读写缓存)中读出数 据。因此,如果要读出数据并修改,则需要可读写缓存。要使用只读缓存,在 cacheModel 设置 readOnly=“true”。要使用可读写缓存,则设置 readOnly=“false”。缺省为只读缓存(true)。

    Serializable可读写缓存

    正如您所知道的,只对当前 Session  有效的缓存对整体应用性能的提高作用有限。 Serializable 可读写缓存可以提高整体应用(而不仅仅是每个 Session)的性能。这种缓存为 每一个 Session 返回缓存对象不同的实例(复本)。因此每一个 Session 都可以安全修改返回 的对象。不同之处在于,通常您希望从缓存中得到同一个对象,但这种情况下得到的是不同 的对象。还有,每一个缓冲在 Serializable 缓存的对象都必须是 Serializable 的。这意味着不 能同时使用 Serializable 缓存和延迟加载,因为延迟加载代理不是 Serializable 的。想知道如 何把 Serializable  缓存,延迟加载和联合查询结合起来使用,最好的方法是尝试。要使用 Serializable 缓存,设置 readOnly=“false”和 serialize=“true”。缺省情况下,缓存是只读模 式,不使用 Serializable 缓存。只读缓存不需要 Serializable。

    缓存类型

    Cache  Model 使用插件方式来支持不同的缓存算法。它的实现在 cacheModel 的用 type 属性来指定(如上所示)。指定的实现类必须实现 CacheController 接口,或是下面 4 个别名 中的其中之一。Cache Model 实现的其他配置参数通过 cacheModel 的 property 元素来设置。 目前包括以下的 4 个实现:

    * “MEMORY” (com.ibatis.db.sqlmap.cache.memory.MemoryCacheController)

    MEMORY cache 实现使用 reference 类型来管理 cache 的行为。垃圾收集器可以根 据 reference 类型判断是否要回收 cache 中的数据。MEMORY 实现适用于没有统一的对 象重用模式的应用,或内存不足的应用。

    MEMORY 实现可以这样配置:

     <cacheModel id="product-cache" type="MEMORY">
    <flushInterval hours="24"/>
    <flushOnExecute statement="insertProduct"/>
    <flushOnExecute statement="updateProduct"/>
    <flushOnExecute statement="deleteProduct"/>
    <property name=”reference-type” value=”WEAK” />
    </cacheModel>

    MEMORY cache 实现只认识一个<property>元素。这个名为“reference-type”属性 的值必须是 STRONG,SOFT 和 WEAK 三者其一。这三个值分别对应于 JVM 不同的内 存 reference 类型。

    下面的表格介绍了在 MEMORY  实现中不同的 reference  类型。要更好地理解 reference 类型,请参考 JDK 文档中的 java.lang.ref,以获得更多关于“reachability”的 信息。

    WEAK(缺省)

    大多数情况下,WEAK  类型是最佳选择。如果不指定类型,缺省类

    型就是 WEAK。它能大大提高常用查询的性能。但是对于当前不被 使用的查询结果数据,将被清除以释放内存用来分配其他对象。

    SOFT

    在查询结果对象数据不被使用,同时需要内存分配其他对象的情况

    下,SOFT 类型将减少内存不足的可能性。然而,这不是最具侵入性 的 reference 类型,结果数据依然可能被清除。

    STRONG

    STRONG 类型可以确保查询结果数据一直保留在内存中,除非 Cache

    被刷新(例如,到了刷新的时间或执行了更新数据的操作)。对于下 面的情况,这是理想的选择:1)结果内容数据很少,2)完全静态的 数据,和 3)频繁使用的数据。优点是对于这类查询性能非常好。缺 点是,如果需要分配其他对象,内存无法释放(可能是更重要的数据 对象)。

    * “LRU” (com.ibatis.db.sqlmap.cache.lru.LruCacheController)

    LRU  Cache 实现用“近期最少使用”原则来确定如何从 Cache 中清除对象。当 Cache 溢出时,最近最少使用的对象将被从 Cache 中清除。使用这种方法,如果一个特定的对象总 是被使用,它将保留在 Cache 中,而且被清除的可能性最小。对于在较长的期间内,某些用 户经常使用某些特定对象的情况(例如,在 PaginatedList  和常用的查询关键字结果集中翻 页),LRU Cache 是一个不错的选择。

    LRU Cache 实现可以这样配置:

     <cacheModel id="product-cache" type="LRU">
    <flushInterval hours="24"/>
    <flushOnExecute statement="insertProduct"/>
    <flushOnExecute statement="updateProduct"/>
    <flushOnExecute statement="deleteProduct"/>
    <property name=”size” value=”1000” />
    </cacheModel>

    LRU Cache 实现只认可一个 property 元素。其名为“cache-size”的属性值必须是整数, 代表同时保存在 Cache 中对象的最大数目。值得注意的是,这里指的对象可以是任意的,从 单一的 String 对象到 Java Bean 的 ArrayList 对象都可以。因此,不要 Cache 太多的对象,以 免内存不足。

    * “FIFO” (com.ibatis.db.sqlmap.cache.fifo.FifoCacheController)

    FIFO  Cache 实现用“先进先出”原则来确定如何从 Cache 中清除对象。当 Cache 溢出 时,最先进入 Cache 的对象将从 Cache 中清除。对于短时间内持续引用特定的查询而后很可 能不再使用的情况,FIFO Cache 是很好的选择。

    FIFO Cache 可以这样配置:

     <cacheModel id="product-cache" type="FIFO">
    <flushInterval hours="24"/>
    <flushOnExecute statement="insertProduct"/>
    <flushOnExecute statement="updateProduct"/>
    <flushOnExecute statement="deleteProduct"/>
    <property name=”size” value=”1000” />
    </cacheModel>

    FIFO Cache 实现只认可一个 property 元素。其名为“cache-size”的属性值必须是整数, 代表同时保存在 Cache 中对象的最大数目。值得注意的是,这里指的对象可以是任意的,从 单一的 String 对象到 Java Bean 的 ArrayList 对象都可以。因此,不要 Cache 太多的对象,以 免内存不足。

    * “OSCACHE” (com.ibatis.db.sqlmap.cache.oscache.OSCacheController)

    OSCACHE Cache 实现是 OSCache2.0 缓存引擎的一个 Plugin。它具有高度的可配置性,分布式,高度的灵活性。

    OSCACHE 实现可以这样配置:

     <cacheModel id="product-cache" type="OSCACHE">
    <flushInterval hours="24"/>
    <flushOnExecute statement="insertProduct"/>
    <flushOnExecute statement="updateProduct"/>
    <flushOnExecute statement="deleteProduct"/>
    </cacheModel>

    OSCACHE  实现不使用 property  元素,而是在类路径的根路径中使用标准的 oscache.properties 文件进行配置。在 oscache.properties 文件中,您可以配置 Cache 的算法(和 上面讨论的算法很类似),Cache 的大小,持久化方法(内存,文件等)和集群方法。

Ibatis学习总结4--SQL Map XML 映射文件扩展的更多相关文章

  1. Ibatis学习总结3--SQL Map XML 映射文件

    在前面的例子中,只使用了 SQL Map 最简单的形式.SQL Map 的结构中还有其他更多 的选项.这里是一个 mapped statement 较复杂的例子,使用了更多的特性. <sqlMa ...

  2. Mybatis学习--Mapper.xml映射文件

    简介 Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心. 映射文件中有很多属性,常用的就是parameterType(输入类型 ...

  3. Mybatis中的Mapper.xml映射文件sql查询接收多个参数

    ​ 我们都知道,在Mybatis中的Mapper.xml映射文件可以定制动态SQL,在dao层定义的接口中定义的参数传到xml文件中之后,在查询之前mybatis会对其进行动态解析,通常使用#{}接收 ...

  4. 解决 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 以及MyBatis批量加载xml映射文件的方式

    错误 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 的出现,意味着项目需要xml文件来 ...

  5. mybatis学习------打包xml映射文件

    编译mybatis时,idea不会将mybatis的xml映射文件一起打包进jar,即在编译好的jar包里缺少mybatis映射文件,导致网站加载失败 为解决这个问题,可在mybatis对应modul ...

  6. MyBatis 的 XML 映射文件使用说明

    简介 文档参考地址:http://www.mybatis.org/mybatis-3/zh/index.html MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器 ...

  7. 精尽MyBatis源码分析 - MyBatis初始化(二)之加载Mapper接口与XML映射文件

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

  8. *.hbm.xml映射文件的元素及属性

    1. 每个持久化对象都需要提供一个以类名命名的映射文件,映射文件需要放在和po类同一目录下. 2. 如下是wefepo的映射文件: <hibernate-mapping> <clas ...

  9. hibernate之xml映射文件关系维护,懒加载,级联

    一:关系维护 --->inverse默认值false,表示不放弃关系的维护.   --->inverse="true"配置在那一端,表示那一端xml对应的po放弃关系的 ...

随机推荐

  1. 初学嵌入式STM32基础下选哪款开发板适合学习

    iTOP-4412开发板 目前为止,在用户网盘上已经积累了多达100G以上资料, 这些资料都是和4412相关的,并不是随便拼凑起来的!同时我们也完全开放原厂资料. 鉴于用户对于海量资料无从下手的问题, ...

  2. linux sed命令

    一.初识sed 在部署openstack的过程中,会接触到大量的sed命令,比如 # Bind MySQL service to all network interfaces. sed -i 's/1 ...

  3. Chrome浏览器与常用插件推荐

    Chrome浏览器与常用插件推荐 官方chrome下载:http://www.google.cn/chrome/ 提示:需要FQ才能安装. 1,AdBlock 谷歌屏蔽广告: https://chro ...

  4. javascript判断回文数

    "回文"是指正读反读都能读通的句子,它是古今中外都有的一种修辞方式和文字游戏,如"我为人人,人人为我"等.在数学中也有这样一类数字有这样的特征,成为回文数(pa ...

  5. 原创翻译-值得关注的10个python语言博客

    原文链接 原文链接的网页感觉网络不是很好,不容易上.我在这里就给大家做个翻译吧. 大家好,还记得我当时学习python的时候,我一直努力地寻找关于python的博客,但我发现它们的数量很少.这也是我建 ...

  6. UVALive 6656 Watching the Kangaroo --二分

    题意:给你一些区间,再查询一些点,问这些点与所有区间形成的最小距离的最大值.最小距离定义为:如果点在区间内,那么最小距离为0,否则为min(pos-L[i],R[i]-pos). 解法:当然要排个序, ...

  7. UVA 11573 Ocean Currents --BFS+优先队列

    采用优先队列做BFS搜索,d[][]数组记录当前点到源点的距离,每次出队时选此时eng最小的出队,能保证最先到达的是eng最小的.而且后来用普通队列试了一下,超时..所以,能用优先队列的,就要用优先队 ...

  8. Flash Builder快捷键

    代码助手:Ctrl+Space(简体中文操作系统是Alt+/)快速修正:Ctrl+1单词补全:Alt+/打开外部Java文档:Shift+F2 显示搜索对话框:Ctrl+H快速Outline:Ctrl ...

  9. window下查看TCP端口连接情况

    window下查看TCP端口连接情况:netstat -ano -p tcp|findstr 10001

  10. int 与Integer的用法与区别

    1.int是基本类型,直接存取数值,Integer是对象,用一个引用指向这个对象. 2.java中的数据类型分为基本数据类型和复杂数据类型,int是前者,Integer是后者(也就是一个类). 3.初 ...