缓存 Mapped Statement结果集
===========================
通过在查询 statement 中指定 cacheModel 属性,可以缓存 Mapped Statement 中得到的查询结果。
Cache model 是在 SQL Map XML 文件中定义的可配置缓存模式,可以使用cacheModel元素来配置。
例子如下:
<cacheModel id="product-cache" type ="LRU" readOnly=!true!± erialize=!±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" (coibatis.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.sqlmapache.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太多的对象,以免内存不足。
"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 的大小,持久化方法(内存,文件等)和集群方法。
要获得更详细的信息,请参考 OSCache 文档。OSCache 及其文档可以从 OpenSymphony网站上获取: http://www.opensymphony.com/oscache/
分享到:
相关推荐
### iBATIS缓存介绍 #### 一、缓存介绍 **1.1 缓存对象** 理论上,Web分层设计的各个层都可以有缓存,Web中的任何对象都可以成为缓存的对象。例如: - **HTTP请求结果的缓存**:如页面数据或API响应。 - **...
### iBATIS缓存的使用方法 在数据库访问框架iBATIS中,缓存机制是一项重要的功能,它能够显著提高应用程序的性能。本文将详细介绍iBATIS中的缓存使用方法,包括缓存模型的配置、不同类型的缓存控制器以及如何在SQL...
通过这个示例,你可以深入理解iBATIS缓存的工作原理,以及如何在项目中有效利用缓存优化性能。对于源码的阅读,可以更直观地了解iBATIS如何实现缓存的存储和检索,这对于调试和优化系统性能非常有帮助。同时,工具的...
总的来说,"spring+ibatis+oracle分页缓存源码"项目展示了如何在Spring管理的环境中,利用iBatis和Oracle数据库实现高效的数据分页和缓存策略。通过理解和实践这些技术,开发者可以构建出更加健壮、响应快速的Web...
在ibatis demo中,我们可能还会看到如何配置Spring与Ibatis的集成,以便利用Spring的依赖注入和事务管理能力。这通常涉及`SqlSessionFactoryBean`的配置以及Mapper接口的扫描和装配。 通过这个demo,你可以了解到...
通过阅读和理解iBatis的源码,我们可以更深入地了解其设计思路,从而更好地利用这个框架,提升我们的开发效率和代码质量。同时,源码学习也能帮助我们解决实际项目中遇到的问题,增强我们在ORM领域的专业技能。
总的来说,"ibatis_with_memcached"项目提供了一个实用的参考,展示了如何在实际开发中利用Ibatis与Memcached集成来优化数据访问,对于提升Java Web应用的性能具有很大的指导价值。开发者可以通过该项目学习到缓存...
通过阅读这三份文档,你将能够深入理解iBATIS的工作原理,掌握其配置和使用技巧,同时也能学习到如何有效地利用iBATIS实现数据库操作的半封装,提高开发效率。在实际项目中,iBATIS可以很好地适应各种复杂的数据库...
Ibatis,全称为MyBatis,是一个优秀的Java持久层框架,它主要负责SQL映射,将数据库操作与业务逻辑解耦,使得开发者可以更专注于业务逻辑的实现...通过深入学习和实践,你可以利用Ibatis轻松地实现复杂的数据访问需求。
为了提高查询性能,ibatis内置了多种缓存机制,包括`MEMORY`类型缓存、`LRU`(Least Recently Used)型缓存、`FIFO`(First In First Out)型缓存和`OSCache`。其中,`MEMORY`类型缓存使用弱引用(WeakReference)来...
**IBATIS API 帮助文档与IBATIS开发文档详解** IBATIS,一个由iBATIS公司开发的开源持久层框架,是Java世界中广泛使用的...通过深入理解和实践,可以充分利用IBATIS的灵活性和强大功能,提升Java应用的数据访问性能。
《iBATIS-SqlMaps》则可能更侧重于实战和案例分析,通过具体的项目场景来展示如何设计和实施iBATIS解决方案,以及如何利用iBATIS实现更高效的数据操作。 两本书结合阅读,开发者可以从理论到实践全面掌握iBATIS框架...
《iBatis官方中文文档》是开发者们学习和掌握iBatis框架的重要参考资料,它包含了iBatis的详细使用说明和一系列技术要点...通过阅读和实践文档中的示例,开发者可以更好地掌握如何利用iBatis进行高效的数据访问和管理。
4. **动态SQL**:学习如何利用iBatis的动态SQL功能,实现条件查询、分页等复杂操作。 5. **参数映射和结果集映射**:掌握如何将Java对象与SQL语句的输入参数和输出结果进行映射。 6. **事务管理**:理解iBatis的...
通过阅读和理解iBatis 2.3的源码,开发者可以更深入地了解数据库访问的底层实现,提高代码质量,避免潜在的问题,并能更好地利用iBatis提供的功能来优化数据库操作。在实际项目中,结合源码分析,能够更好地定制和...
11. **动态SQL**:详细阐述如何利用iBatis的动态SQL特性,通过`<if>`, `<choose>`, `<when>`, `<otherwise>`, `<where>`, `<set>`, `<foreach>`等标签实现动态构建SQL语句。 12. **最佳实践**:提供iBatis在实际...
- **性能优化与缓存**:了解如何利用iBATIS的缓存机制来提高应用性能,减少数据库访问次数。 - **数据访问对象(DAO)模式**:深入研究iBATIS如何支持DAO模式,简化数据访问逻辑,实现业务逻辑与数据访问的分离。 - ...
- **目的**:通过整合,我们可以利用SpringMVC的MVC能力处理HTTP请求,同时利用iBatis的数据库操作能力。 - **配置步骤**: 1. 引入iBatis和SpringMVC的依赖库。 2. 配置Spring的ApplicationContext,包括数据源...