`
raymond2006k
  • 浏览: 295567 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

对IBatis的Cache设计的一点看法

阅读更多
前两天,又看了一下原作《IBatis in Action》,对缓存(Cache)一节又仔细阅读了一次,感觉 IBatis 的 Cache 设计有点鸡肋的感觉,企业级应用基本不会采用。

1. 缓存什么?
   书中写道,一般ORM框架,如Hibernate等,采用对象缓存,而IBatis采用的是简单查询缓存。
   简单 query 缓存,意即:
    cache.key = sql语句串
    cache.value = 查询结果记录集合(List等)
   对于一条 映射sql语句,执行时其条件值的集合,理论上是一个无限集,至少条件集会非常大。因此 sql + 条件值的组合数量非常庞大,按结果集合作为 cache.value 的方式缓存,可以预计,内存消耗非常巨大。

   从缓存的对象来讲,Hibernate 等的两级缓存是一种更好的设计( session级缓存属于第一种 )。
   对象缓存(Object Cache),将对象像库表记录一样,按主键进行缓存,相当于建立一个简单的内存数据库;
   查询缓存(Query Cache), 与 IBatis 的缓存所指相同,但它只缓存结果集的主键,因此 cache.value 空间消耗大大减少。

   这样对比可见,IBatis 的Cache 不太适合数据量庞大的企业级应用,大型网站应用。

2. 缓存到哪儿?
   应该说,如果 IBatis没有提供对 OSCache 的默认支持,那么IBatis的Cache仅仅适合单机部署的小型应用。
   但 OSCache 作为分布式缓存的一种,在实际应用中仅占不大的比例。

   对于集群部署的大型应用,如果 IBatis 能提供对 Whalin Memached, Spy Memcached,Coherence 等提供支持,将是一种更好的选择。
   幸好,IBatis 还提供了 Cache 的扩展点,可以集成自定义的 Cache 方案。 ^_^
分享到:
评论
9 楼 C_J 2010-04-28  
竟然偶然做了一次挖坟党!! 而且还有当年自己的回复,汗一个!!当年自己完全都不懂啊~~ 又汗一个!!
还是继续补充下吧

引用

因此 sql + 条件值的组合数量非常庞大,按结果集合作为 cache.value 的方式缓存,可以预计,内存消耗非常巨大。


**对于按照SQL语句作为key,很正常,hibernate也是这样做。
**如果你对动态SQL的查询结果也使用缓存,也就当然会产生多个数据拷贝,甚至冗余。
**对于记录>1000条,应该不太推荐用缓存,一个大数据量表使用缓存,必定会撑死内存。

引用

对象缓存(Object Cache),将对象像库表记录一样,按主键进行缓存,相当于建立一个简单的内存数据库;
查询缓存(Query Cache), 与 IBatis 的缓存所指相同,但它只缓存结果集的主键,因此 cache.value 空间消耗大大减少。


**其实你想过为什么ibatis没有“对象缓存”的概念呢?原因就是ibatis映射的是resultClass 和paramClass,而不是基于表的映射,对于ibatis,查询缓存就是对象缓存。

**正因为不需要对象缓存,所以value自然是resultClass的值了,而非id,其实hibernate和ibatis一样也需要那么多内存的。
8 楼 raymond2006k 2009-10-09  
C_J 写道
H是重量级组件
IBATIS是轻量级组件

设计重点也不同;
引用
IBatis 的Cache 不太适合数据量庞大的企业级应用,大型网站应用。


关于这点,反驳的理由:
以下是目前一些大型网站用了IBATIS:
...


用 IBatis,和直接用 IBatis自身的Cache 不是一个概念。
我们的大型网站也用的是 IBatis 作为持久化方案。而自身提供的Cache比较弱,且禁止使用的,主要用的是 Memcached 缓存。
7 楼 raymond2006k 2009-10-09  
lovit 写道
对象缓存与对象池有什么关系呢,什么时候用对象缓存,什么时候用对象池?谢谢!


这里说的“对象缓存”是对持久化的数据对象缓存,按主键值将其缓存到内存。

与一般所说的Java对象缓存及对象池(Object Pool)不是一回事,本帖不涉及此话题。
6 楼 C_J 2009-10-01  
H是重量级组件
IBATIS是轻量级组件

设计重点也不同;
引用
IBatis 的Cache 不太适合数据量庞大的企业级应用,大型网站应用。


关于这点,反驳的理由:
以下是目前一些大型网站用了IBATIS:
Some public websites that utilize IBatis

1up.com - Gaming community  
http://www.1up.com  
Abebooks.com - Worlds largest online marketplace for books  http://www.abebooks.com  
AccesStream.com - Open Source Identity and Access Management Suite  http://www.accesstream.com  
BullionVault.com - Online gold trading  http://www.bullionvault.com  
www.druckdiskont.at - Online print portal (Web To Print)  http://www.druckdiskont.at  
Fiskars - Consumer products manufacturer 
 http://www.fiskars.com  
GalMarley.com - Gold prices, facts, figures and charts  http://www.galmarley.com  
GAPay - General Agent Payment System  
http://www.gapay.com.  
Ideal Financial Services  
http://www.idealfsi.com  ....



于是也简单查了下IBATIS的Cache源码;

- 三种模式
/**
   * Constant for weak caching
   * This cache model is probably the best choice in most cases. It will increase
   * performance for popular results, but it will absolutely release the memory to
   * be used in allocating other objects, assuming that the results are not currently
   * in use.
   */
  public final static MemoryCacheLevel WEAK;

  /**
   * Constant for soft caching.
   * This cache model will reduce the likelihood of running out of memory in case the
   * results are not currently in use and the memory is needed for other objects.
   * However, this is not the most aggressive cache-model in that regard. Hence,
   * memory still might be allocated and unavailable for more important objects.
   */
  public final static MemoryCacheLevel SOFT;

  /**
   * Constant for strong caching.
   * This cache model will guarantee that the results stay in memory until the cache
   * is explicitly flushed. This is ideal for results that are:
   * <ol>
   * <li>very small</li>
   * <li>absolutely static</li>
   * <li>used very often</li>
   * </ol>
   * The advantage is that performance will be very good for this particular query.
   * The disadvantage is that if the memory used by these results is needed, then it
   * will not be released to make room for other objects (possibly more important
   * objects).
   */
  public final static MemoryCacheLevel STRONG;





- 4种策略

FIFO
LRU
MEMORY
OS

-至于楼主提出的存储每条记录,这个一下子也没查到

-关于"内存消耗"这个问题,是以存储的数据单元的大小决定的,总内存=单元数据大小*个数  ,而这个"个数"完全有用户由设定,我觉得存储整条记录和存储主键,各有各的优势..

5 楼 whaosoft 2009-09-30  
呃 和hibernate比是差很多~~ 连memcache 都不支持 ?
4 楼 lnaigg 2009-09-29  
ibatis跟hibernate的运行机制完全不同,它们的缓存机制也是没有可比性的。
可以这样说,ibatis不可能做到基于对象的缓存。


至于集群缓存,那是很简单的事情。
3 楼 matt.u 2009-09-28  
1、iBATIS的缓存机制自己扩展一下就能支持memcache了。

2、其实个人觉得iBATIS的简单查询缓存策略还更灵活一些。
如果你想像Hibernate那样缓存,也可以把一个查询分成两部分,将一个查询分成N+1个查询,也可以像Hibernate那样缓存。

应该也够用了。
2 楼 lovit 2009-09-28  
对象缓存与对象池有什么关系呢,什么时候用对象缓存,什么时候用对象池?谢谢!
1 楼 Foxswily 2009-09-28  
兄台描绘的场景是iBatis在企业应用时(尤其是大数据量)使用缓存。认为存在的瓶颈是大量数据集(cache.value)的存储。窃以为这是混淆了企业级数据应用与轻量级缓存的概念。此处大数据集势必需要独立的缓存服务(至少是文件缓存)而不是单纯的内存缓存,由此出发,很多后续问题可以针对具体业务具体部署,iBatis只负担在缓存miss时与DB交互,这样是不是更纯粹呢。

相关推荐

    Java_ibatis-cache.rar_cache

    在Java开发领域,iBatis作为一个轻量级的持久层框架,因其简洁高效而深受开发者喜爱。...阅读《Java_iBatis cache.doc》文档,你会获得更详细的实践指导和示例代码,进一步深化对iBatis缓存的理解。

    Spring高版本对ibatis的支持

    最近想在最新的Spring5.0中集成ibatis(不是mybatis),发现已经不在支持SqlmapClientTemplate和SqlmapClientFactoryBean,于是搞了这个工具jar来进行支持如下配置 ...

    ibatis源码,ibatis源码 ibatis源码 ibatis源码

    源码中`org.apache.ibatis.cache.Cache`接口定义了缓存的基本操作,而具体的缓存实现如`org.apache.ibatis.cache.impl.PerpetualCache`则实现了缓存的存储和读取。 通过阅读和理解iBatis的源码,我们可以更深入地...

    ibatis 一对多 多对多完整映射

    在数据库设计中,一对多关系是指一个父记录可以与多个子记录关联,例如,一个用户可以有多个订单。在iBATIS中,我们可以通过配置XML映射文件来实现这种关系。 1. **配置映射文件** 在`ibatis`的映射文件中,你...

    ibatis总结 ibatis ibatis ibatis ibatis

    - `applicationContext.xml`是Spring的主配置文件,它定义了Spring容器中的bean,包括对Struts、Ibatis等其他框架的配置,实现各组件间的依赖注入。 - `codelist.xml`则可能包含了全局共享的bean,如`...

    ibatis多对多关系(详细)

    iBatis多对多关系详解 iBatis是一种流行的持久层框架,用于简化Java应用程序和关系数据库之间的交互。在本文档中,我们将详细介绍iBatis在处理多对多关系时的配置和实现。 多对多关系 多对多关系是一种常见的关系...

    ibatis demo,ibatis例子,ibatis示例

    通过这个demo,你可以了解到Ibatis的基本用法,如何编写SQL映射文件,如何设计Mapper接口,以及如何在Java代码中调用这些接口执行数据库操作。同时,也能掌握Ibatis的动态SQL特性,以及如何配合Spring进行更高效的...

    Spring对IBatis的整合

    ### Spring对IBatis的整合 #### 一、Spring与IBatis整合概述 Spring框架与IBatis(现称为MyBatis)的整合为开发者提供了一种更简洁、更强大的数据库访问方式。Spring通过其内置的支持机制极大地简化了原有的IBatis...

    iBATIS实战.pdf

    书中既详实地介绍了iBATIS的设计理念和基础知识,也讨论了动态SQL、高速缓存、DAD框架等高级主题,还讲解了iBATIS在实际开发中的应用。《iBATIS实战》的最后给出了一个设计优雅、层次清晰的示例程序JGameStore,该...

    ibatis 一对多

    本文将深入探讨`iBatis` 中的一对多映射关系,以及如何通过源码理解和使用这个特性。 一对多映射是数据库关系模型中的常见概念,指的是一个父表(如部门表)可以对应多个子表(如员工表),每个部门可以有多个员工...

    ibatis配置多表关联(一对一、一对多、多对多

    ibatis配置多表关联(一对一、一对多、多对多

    iBATIS-DAO-2.3.4.726.rar_com.ibatis.dao_iBATIS dao 2_iBatis DAO_

    总的来说,iBATIS DAO 2.3.4.726版的源码分析对于学习和理解Java中的持久层设计有极大的帮助。通过阅读和理解源码,开发者不仅能掌握iBATIS DAO的基本使用,还能深入了解其内部实现,提升数据库操作的技巧和优化能力...

    Ibatis一对一映射提示

    一对一映射在数据库设计中是指两个表之间存在一对一的关系,例如,一个员工可能只有一个部门,一个部门也只对应一个员工。在iBATIS中,这种关系可以通过配置XML映射文件或者注解来实现。 **一对一映射的基本概念:*...

    Ibatis入门例子,Ibatis教程

    随着对Ibatis的深入理解和实践,你会发现它在处理数据库操作时的灵活性和强大性。在实际项目中,结合Spring框架使用Ibatis,可以构建出更加健壮、高效的后端系统。因此,无论你是初学者还是有经验的开发者,掌握...

    ibatis

    Ibatis 的设计目标是简化开发工作,减少JDBC代码量,提高开发效率,并且在数据库操作上保持灵活度,使得业务逻辑和数据访问层之间的接口清晰明了。 Ibatis 的核心组件包括SqlMapConfig.xml配置文件、Mapper XML ...

    Ibatis

    5.1 DAO 层设计:基于 Ibatis,开发者可以创建自定义的 DAO 接口,接口方法对应 SQL 映射文件中的 SQL 语句,实现业务逻辑的解耦。 5.2 事务管理:Ibatis 提供了事务控制接口 SqlSession,可以通过编程式或声明式...

    SPRINGMAVN Ibatis架构图

    在IT行业中,SpringMVC和iBatis是两个非常重要的框架,它们经常被结合使用来构建企业级的Java Web应用程序。SpringMVC是Spring框架的一部分,主要负责处理HTTP请求和控制应用程序的流程,而iBatis则是一个轻量级的...

    ibatis教程,ibatis帮助文档

    相对于全自动化ORM解决方案如Hibernate,iBATIS被称为“半自动化”ORM实现,因为它允许开发者直接编写SQL语句,保持对数据库查询的精细控制。 一、iBATIS的核心要素——SQL Maps SQL Maps是iBATIS的核心,通过XML...

    ibatis 一对多关系映射

    一对多关系在数据库设计中非常常见,它意味着一个实体可以与多个其他实体关联。例如,一个用户可能有多个订单,或者一个部门包含多个员工。在Ibatis中,这种关系可以通过配置XML映射文件或使用注解来实现。 首先,...

    ibatis plugin用户指南

    iBatis Plugin是一款专为IntelliJ IDEA设计的插件,旨在简化iBatis框架的开发流程,提供包括SQLMap XML编辑、代码提示在内的多种便捷功能。与Eclipse中的Abator不同,iBatis Plugin不仅限于代码生成,而是全方位地...

Global site tag (gtag.js) - Google Analytics