ibatis缓存浅析
一、缓存介绍
1.1、引入
什么影响Internet访问速率?
访问网站的过程是通过建立在TCP/IP协议之上的HTTP协议来完成的。从客户端发出一个HTTP请求开始,用户所经历的等待时间主要决定于DNS和网站的响应时间。网站域名首先必须被DNS服务器解析为IP地址,HTTP的延时则由在客户端和服务器间的若干个往返时间所决定。
往返时间是指客户端等待每次请求的响应时间,平均往返时间取决于三个方面:网站服务器的延时; 由路由器、网关、代理服务器和防火墙引入的延时;不同通信链路上的数据传输速率.
1.2、缓存对象
理论上,Web分层设计的各个层都可以有缓存,Web中的任何对象都可以缓存。
1.2.1、Http请求结果的缓存
浏览器缓存、代理缓存、服务器端方向代理缓存、使用Filter实现对请求结果页面的缓存
1.2.2、Java对象的缓存
缓存数据库查询结果对象
1.3、缓存介质[保存在哪里]
从硬件介质上来将无非就是两种,内存和硬盘.但是往往我们不会从硬件上来划分,一般的划分方法是从技术上划分,可以分成几种,内存,硬盘文件.数据库.
1.4、缓存的类型
网络缓存可以在客户端,也可以在网络上,由此我们将缓存分为两类:浏览器缓存和代理缓存。
1.4.1、浏览器缓存
几乎目前所有的浏览器都有一个内置的缓存,它们通常利用客户端本地的内存和硬盘来完成缓存工作,同时允许用户对缓存的内容大小作控制。
1.4.2、代理缓存
代理缓存是一种独立的应用层网络服务,它更像E-mail、Web、DNS等服务。许多用户不仅可以共享缓存,而且可以同时访问缓存中的内容。其工作原理:当代理缓存收到客户端的请求时,它首先检查所请求的内容是否已经被缓存。如果没有找到,缓存必须以客户端的名义转发请求,并在收到服务器发出的文件时,将它以一定的形式保存在本地硬盘,并将其发送给客户端。
1.5、缓存更新策略
1.5.1 FIFO[first in first out]
最先进入缓存得数据在缓存空间不够情况下(超出最大元素限制时)会被首先清理出去
1.5.2 LFU[Less Frequently Used]
一直以来最少被使用的元素会被被清理掉。这就要求缓存的元素有一个hit 属性,在缓存空间不够得情况下,hit 值最小的将会被清出缓存。
1.5.3 LRU[Least Recently Used]
最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
二.iBATIS高速缓存介绍
2.1 iBATIS高速缓存的关注点
iBATIS高速缓存只关注如何在持久层对查询结果进行缓存。
2.2 iBATIS对高速缓存管理的帮助
iBATIS带来的好处就是通过配置文件来管理高速缓存,帮助避免因手工管理高速缓存结果及其依赖性而造成的大量繁琐的工作。
2.3 iBATIS高速缓存和传统O/RM高速缓存的区别
iBATIS的思想是建立SQL语句到对象的映射,而不是建立数据库表到对象的映射。传统O/RM工具主要关注数据库表到对象的映射。传统的O/RM高速缓存会为其管理的每个对象维护一个OID[object identification,对象标识],就像数据库需要管理其表中的每条记录的唯一性一样。这意味着,如果两个不同的结果都返回同一个对象,那么该对象将只被高速缓存一次。iBATIS不这样,关注的是SQL语句的执行结果,我们不会根据对象的唯一性来高速缓存它们iBATIS高速缓存的所有结果,而不考虑所标识的对象是否存在于高速缓存中。
三.配置iBATIS缓存
3.1 、cacheModel标签
cacheModel标签用来配置iBATIS的高速缓存,cacheModel标签的属性包括四个属性
id[必需]
该值用来指定一个唯一的ID,便于为需要使用此高速缓存模型所配置的高速缓存的查询已映射语句使用。
type[必需]
此属性用于指定高速缓存所配置的高速缓存的类型。其有效值包括MEMORY LRU FIFO OSCACHE,该属性也可取值为某个自定义CacheController实现的全限定名。
readOnly[可选]
取值为true时表示高速缓存将仅仅用作只读缓存,从只读高速缓存中读出的对象的特性值不允许修改。
serialize[可选]
该属性用于指定在读取高度缓存内容时是否要进行“深复制”
readOnly、serialize属性经常联合起来使用。
3.2 、iBATIS高速缓存模型的类型
3.2.1 MEMORY
MEMORY高速缓存是一种基于引用的高速缓存。MEMORY高速缓存模型对于那些更关注内存的管理策略而不是对象的访问策略的应用程序而言是完美的。有了STRONG、SOFT、WEAK这三种引用类型,就可以确定哪些结果应该比其他结果保留更长的时间。
3.2.2 LRU
LRU类型的高速缓存模型使用最近最少使用策略来管理高速缓存。该高速缓存的内部机制会在后台记录哪些对象最近最少使用,一旦超过高速缓存大小限制就会废弃它们。大小限制规定了高速缓存中可以存放的对象数目。应避免将那些占用较大内存的对象放置在此类高速缓存中,否则内存会很快耗尽。
LRU高速缓存非常设用于那些需要根据某些特定对象的访问频率来管理的高速缓存的情况。通常这种高速缓存策略试用于那些需要高速缓存用于分页结果或关键词搜索结果的对象应用程序中。
3.2.3 FIFO
FIFO高速缓存模型采用先进先出的管理策略,是一种基于时间的策略,使用于放置那些初放入时使用频率高、随时间流逝访问频率就会降低的对象。如:报表、报告股票价格。
3.2.4 OSCACHE
OSCache是个一个广泛采用的高性能的J2EE缓存框架,OSCache能用于任何Java应用程序的普通的缓存解决方案。OSCache有以下特点:
缓存任何对象,你可以不受限制的缓存部分jsp页面或HTTP请求,任何java对象都可以缓存。
拥有全面的API--OSCache API给你全面的程序来控制所有的OSCache特性。
永久缓存--缓存能随意的写入硬盘,因此允许昂贵的创建(expensive-to-create)数据来保持缓存,甚至能让应用重启。
支持集群--集群缓存数据能被单个的进行参数配置,不需要修改代码。
缓存记录的过期--你可以有最大限度的控制缓存对象的过期,包括可插入式的刷新策略(如果默认性能不需要时)
3.2.5自定义高速缓存模型
只需要实现com.ibatis.sqlmap.engine.cache.CacheController接口即可,配置时设定type为全限类名或其别名即可。
3.3 高速缓存的清除
使用flushOnExecute、flushInterval标签可以定义清空缓存触发条件
<flushOnExecute> 定义查询已映射语句,其执行将引起相关高速缓存的清除
<flushInterval> 定义一个时间间隔,高速缓存将以此间隔定期清除
<flushInterval>标签属性如下:
hours(可选) 每次清除高速缓存前应该经过的小时数
minutes(可选) 每次清除高速缓存前应该经过的分钟数
seconds(可选) 每次清除高速缓存前应该经过的秒数
milliseconds(可选) 每次清除高速缓存前应该经过的毫秒数
3.4 设置高速缓存模式实现的特性
由于高速缓存模型只是一些可以插入到iBATIS框架的组件,它甚至允许用户自己定制,因此必须有一种方式能为这些组件提供任意的值。<property>标签就是用来完成此任务的。name :所设定的特性的名称,value:所设定的特性的值。
3.5 常见问题
3.5.1如何选择iBATIS高速缓存模型类型
如何选择一个适合实际应用情况的高速缓存模型类型是一个很负责的问题,需要考虑诸多因素。
需要考虑的因素:
1.当前应用程序是否是数据库的唯一操作入口
2.读写属性
3.缓存时间间隔
4.失效控制
5.最大保存对象数目