前两天,又看了一下原作《IBatis in Action》,对缓存(Cache)一节又仔细阅读了一次,感觉 IBatis 的 Cache 设计有点鸡肋的感觉,企业级应用基本不会采用。
[b]1. 缓存什么?[/b]
书中写道,一般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 不太适合数据量庞大的企业级应用,大型网站应用。
[b]2. 缓存到哪儿?[/b]
应该说,如果 IBatis没有提供对 OSCache 的默认支持,那么IBatis的Cache仅仅适合单机部署的小型应用。
但 OSCache 作为分布式缓存的一种,在实际应用中仅占不大的比例。
对于集群部署的大型应用,如果 IBatis 能提供对 Whalin Memached, Spy Memcached,Coherence 等提供支持,将是一种更好的选择。
幸好,IBatis 还提供了 Cache 的扩展点,可以集成自定义的 Cache 方案。 ^_^
[b]1. 缓存什么?[/b]
书中写道,一般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 不太适合数据量庞大的企业级应用,大型网站应用。
[b]2. 缓存到哪儿?[/b]
应该说,如果 IBatis没有提供对 OSCache 的默认支持,那么IBatis的Cache仅仅适合单机部署的小型应用。
但 OSCache 作为分布式缓存的一种,在实际应用中仅占不大的比例。
对于集群部署的大型应用,如果 IBatis 能提供对 Whalin Memached, Spy Memcached,Coherence 等提供支持,将是一种更好的选择。
幸好,IBatis 还提供了 Cache 的扩展点,可以集成自定义的 Cache 方案。 ^_^