MyBatis缓存配置

一、缓存:
所谓的缓存从广义上来讲:提升数据的查询性能。通过整个的计算机的结构来讲,CPU所需要的数据通过内存取得,而内存的数据可以通过磁盘加载完成。但是在整个的项目的开发环节过程之中会出现一种可怕的问题:就是说计算机可能很忙碌,一个进程需要进行磁盘文件的读取,需要1S的时间,但是如果说现在有20W个进程同时需要进行数据的读取过程,那么这个过程就有可能造成计算机的假死状态。所以现在的开发基本上需要解决最大的问题就在于:内存和磁盘之间的数据读取效率问题。
所以这个时候发现程序效率最大的问题都来自于磁盘。
缓存
在整个的缓存操作过程之中需要考虑如下几种问题:
· 什么样的数据需要被放在缓存里?
· 数据需要在什么时候通过缓存清空;
· 数据如果都保存在一个缓存里面,可能不方便。
缓存一般分为两种:一级缓存(单个用户、SqlSession)、二级缓存(所有用户、SqlSessionFactory)。
当你使用了缓存的话,就意味着你丧失了自动数据同步的功能支持。也就是说在内存中的数据与数据表中的数据可能不一致。
二、一级缓存
一级缓存指的是SqlSession 级的缓存处理,并且不管用户如何处理,一级缓存永远都会存在。
由于查询的是同一条数据的记录,并且是同一个SqlSession 接口对象发出的,所以最终只向数据库里面发送了一次数据查询的请求,而第二次的查询并没有发出请求,因为它发现缓存中有同样的数据存在。
实际当修改了第一次查询结果中的数据之后,随后第二次查询的结果里面的内容也会发生相应的改变,但是此时数据库之中并没有任何的变化。
那么如果说同样的操作,在第二次查询前进行了一个数据更新操作呢?
此时的缓存并没有起作用,第二次的查询会直接进行数据库的查询操作处理。这是因为在进行提交处理的时候,会自动进行缓存的清空,因为它认为这个数据已经没有必要进行缓存了。
如果有需要也可以利用SqlSession 接口中提供的方法进行手工的缓存清空:
· 手工清空缓存:public void clearCache()
三、二级缓存
两个不同用户查询相同数据,那么这些数据默认情况下是无法缓存的,并且每一个SqlSession 都要发出查询指令。
1、 如果要想开启二级缓存,则需要进行如下修改:

<!-- 进行Mybatis的相应的环境的属性定义 -->
<settings> <!-- 在本项目之中开启二级缓存 -->
    <setting name="cacheEnabled" value="true"/>
</settings>

· 在需要使用到News.xml 的缓存文件上进行相应的配置,表示该文件允许使用缓存:

<cache/>

2、 如果要想真正启用缓存,还需要注意两点:
· 第一个session 必须关闭之后才会将内容写入到二级缓存之中,如果不关闭,缓存无法写入:
如果要想进行缓存的实现,那么VO 类一定要实现java.io.Serializable 接口:
3、News.xml 文件里面简单的编写了一个“cache/”配置,这个配置实际上只是启用了默认的缓存模式:
但是对于以上的参数的详细解释如下:
· “eviction=”FIFO””:表示该缓存操作所使用的算法,有如下几种算法模式:
|- LRU(默认的):最近最少使用算法,将最近不使用的对象进行清空;
|- FIFO:先进先出算法,默认会自动清除最早缓存的数据对象;
|- SOFT:软引用,当内存不足时,执行GC 会立刻清除;
|- WEAK:弱应用,只要发生了GC,该缓存的对象就会被清空。
· “flushInterval=”10000””:缓存的刷新时间,单位为毫秒;
· “readOnly=”true””:缓存永远做只读配置,千万不要做读、写配置;
· “size=”512””:占用的内存大小,默认是1024K。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章