`
lanxin1985
  • 浏览: 82998 次
  • 性别: Icon_minigender_2
  • 来自: 大连
社区版块
存档分类
最新评论

ibatis缓存的使用

阅读更多
缓存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"/> http://www.ibatis.com
<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”
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的大小,持久化方法(内存,文件等)和集群方法。要获得更详细的信息,请参考OSCache文档。OSCache及其文档可以从OpenSymphony网站上获取:http://www.opensymphony.com/oscache/
分享到:
评论

相关推荐

    iBATIS缓存的使用方法

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

    iBATIS缓存

    总的来说,iBATIS缓存是优化数据库操作性能的有效手段,但同时也需要谨慎使用,合理配置缓存策略,防止出现因缓存导致的数据不一致问题。了解和掌握iBATIS缓存的原理与实践,能帮助开发者更好地优化应用程序,提升...

    ibatis-缓存使用示例

    在IT行业中,数据库操作是应用程序开发的核心部分,而iBATIS作为一个流行的持久层框架,它为Java开发者提供了...通过"ibatis-缓存使用示例"的学习,开发者能更好地掌握这一技巧,从而在实际项目中发挥出更大的价值。

    iBATIS缓存介绍

    - **1.2.3 数据库**:特定类型的数据库(如BerkeleyDB)由于不支持SQL查询,只提供键值对存储,因此可以作为高性能缓存使用。 **1.3 命中率** 命中率指请求缓存次数与缓存返回正确结果次数的比例。命中率越高,...

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

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

    解决IBatis缓存动态字段问题

    ### 解决IBatis缓存动态字段问题 #### 背景与问题描述 在使用IBatis框架处理数据库操作时,可能会遇到动态数据表名、动态字段名的情况。这种情况下,由于IBatis的缓存机制,可能导致字段找不到的问题。具体表现为...

    ibatis 缓存配置策略

    以下是对iBatis缓存配置策略的深入解析: 首先,iBatis 的 Cache 键(key)是由多个因素组成的,包括对象的hashCode、checksum、查询参数、sqlmap ID、SQL语句以及调用方法名。由于这些因素的多样性,即使是微小的...

    Java_ibatis缓存技术

    在实际应用中,我们可以通过以下方式配置和使用iBatis缓存: - **启用二级缓存**:在MyBatis的配置文件中启用全局缓存,并在Mapper接口的XML配置文件中添加`&lt;cache&gt;`标签,指定缓存策略。 - **自定义缓存实现**:若...

    iBATIS缓存介绍[借鉴].pdf

    本文将详细介绍iBATIS缓存的概念、类型以及配置方法。 一.缓存介绍 缓存,简单来说,是为了减少对数据库的频繁访问,将常用数据存储在快速访问的介质中。这有助于降低延迟,提高应用的响应速度。 1.1 缓存对象:...

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

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

    ibatis_数据缓存

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

    ibatis的使用教程

    要开始使用 Ibatis,首先需要从官方网站下载最新版本的 ibatis jar 包,以及 log4j 日志框架的 jar 包。然后,在Java项目中添加这些库,配置log4j.properties以开启SQL日志输出。接着,新建主配置文件sqlMapConfig....

    ibatis 数据缓存.pdf

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

    ibatis 使用手册

    此外,还会介绍如何处理结果集、执行批量操作、使用缓存机制等高级特性。 **iBatis SQL Maps** - **Select**: 用于查询数据,可以返回单个对象、列表或者Map。 - **Insert**: 插入数据,支持自动获取自增主键值。 ...

    IBatis简单使用

    以上就是IBatis的基本使用方法和核心概念,通过它可以有效地提升数据库操作的便捷性和灵活性,降低开发成本。在实际项目中,可以根据需求进行扩展和定制,如结合Spring框架实现更高级的整合应用。

    spring+ibatis+oracle分页缓存源码

    在Spring+iBatis+Oracle体系中,缓存可以分为两种类型:一级缓存(本地缓存)和二级缓存。 一级缓存是iBatis默认提供的,它存在于SqlSession级别,同一SqlSession内的多次查询会共享结果,避免了重复的数据库访问。...

    ibatis使用及环境搭建文档

    5. **缓存机制**: Ibatis提供了本地缓存和二级缓存,可以提高数据访问速度。 **案例实践** 一个简单的Ibatis查询操作示例: 1. 定义Mapper XML文件,包含一个查询所有用户信息的SQL语句: ```xml SELECT * FROM...

Global site tag (gtag.js) - Google Analytics