ibatis设置缓存

最近项目要做个ibatis缓存,再网上找了些资料,做个笔记。

 <cacheModel id="test-cache" type="LRU" readOnly="true"> 
  <flushInterval hours="24"/> 
  <flushOnExecute statement="test.insertCmsFile"/>
  <flushOnExecute statement="test.updateCmsFile"/> 
  <flushOnExecute statement="test.deleteCmsFile"/> 
  <property name="size" value="1000" /> 
 </cacheModel>
 
id:唯一的ID,让需要cache功能的select语句能够引用 
 
type:cache的类型,合法的值包括MEMORY,LRU,FIFO,OSCACHE。如果需要自定义cache的类型就需要实现CacheController接口,type值的value就是实现类的类名
 MEMORY:ibatis直接将数据放进内存中,由GC负责管理,如果属性<property name="reference-type" value="WEAK"/>的值为WEAK、SOFT,GC将根据内存使用情况清理缓存如果该值为Strong,缓存将一直保存,知道flush。
 LRU:用最近最少使用算法清除缓存。            
 FIFO:先进先出算法清除缓存,适合于用户在短时间内持续引用特定的查询,而后很可能不再使用。
 OSCACHE:第三方自定义缓存中间件,通过oscache.properties配置
    
readOnly:默认值为true,如果是true,表示这个cache是只读cache,从cache中获取对象的属性都不应该被修改。
但设置成true并不能阻止对象属性被改变,如果对返回的结果做了改变,cache中的内容也会跟着改变。
换句话说,readonly=true意味着应用程序要保证不会对cache的内容做任何改变。相反,
readonly=false意味着应用程序会对返回结果加以修改,Ibais返回的缓存结果和ocache中的内容就不会使用同一个应用实例。
 
serialize(可选) 这个属性意味着是否要在获取对象之前做“深度拷贝”。
serialize=true意味着向缓存请求得到的内容都是cache对象深度拷贝的结果,即有相同的值但不是相同的实例。该选项可选,缺省值是false。

readonly和serialize的组合会影响到应用程序的性能,

readonly serialize 组合结果
true false 好 
false true 好 
false false 警告 
true true 差

<flushInterval hours="24"/> --缓存刷新时间
flushOnExecute定义insertCmsFile、updateCmsFil,edeleteCmsFile方法执行时候,缓存将flush掉
<flushOnExecute statement="test.insertCmsFile"/>
<flushOnExecute statement="test.updateCmsFile"/> 
<flushOnExecute statement="test.deleteCmsFile"/> 
<property name="size" value="1000" />

配置查询缓存
 <select id="getByFileId" parameterClass="java.lang.Integer" resultMap="TestFile" cacheModel="test-cache" >
  <![CDATA[select * from TEST_FILE WHERE  FILE_ID=#fileId#]]>
 </select>
 
查看缓存是否成功
TestFile file1 = new TestFileDelegate().getTestFile(1761);
TestFile file2 = new TestFileDelegate().getTestFile(1761);
TestFile file3 = new TestFileDelegate().getTestFile(1761);

通过Debug功能,对象的id值相同,说明缓存配置成功。
file1 File  (id=5629) 
file2 File  (id=5629) 
file3 File  (id=5629) 

也可以通过查看数据库的数据字典确定是否执行了数据库操作,oracle数据库。

SELECT sql_id, child_number, executions,sql_text
FROM v$sql
WHERE sql_text like '%select * from TEST_FILE WHERE  FILE_ID=:1%' order by executions desc;

executions表示执行次数,因为用了绑定变量,每次执行时executions会加1,如果executions值不变,说明使用了缓存,没查数据库

你可能感兴趣的:(ibatis设置缓存)