壹 、查询缓存

询问缓存的采取,重即使为着增强查询访问速度。将用户对相同数据的双重查询进度简单化,不在每趟均从数据库中查询获得结果数据,从而增强访问速度。

XML 1XML 2

 
 MyBatis的查询缓存机制,依照缓存区的功效域与生命周期,可分割为三种:一级缓存和二级缓存。

 
 MyBatis查询缓存的作用域是依据映射文件mapper的namespace划分的,相同namespace的mapper查询数据存放在同3个缓存区域。分歧的namespace下的数据互不烦扰。无论是顶级缓存照旧二级缓存,都是遵照namespace实行个别寄存的。

 
 但壹 、二级缓存的不一样之处在于,SqlSession一旦关闭,则SQLSession中的数据将不设有,即超级缓存就不存在,而二级缓存的生命周期会与总体应用同步,与SQLSession是或不是关闭非亲非故。

 
一句话来说,一流缓存是在同一线程(同一SQLSession)间共享数据,而二级缓存是在差异线程间共享数据。

 二 、超级缓存的印证

XML 3

XML 4

3、从缓存中找寻数据的依照

XML 5

 

XML 6

MyBatis的询问依照是:Sql的id+SQL语句。

Hibernate的查根据是:查询结果对象的id。

缓存的底层落成是三个Map,Map的value是查询结果。Map的key,即查询依照,使用的O本田CR-VM架构差异,查询依据就不例外。

ORM

O奥迪Q5M(Object Relational
Mapping)框架选择元数据来叙述对象一提到映射细节,元数据一般采用XML格式,并且存放在尤其的靶子一映射文本中。

比方提供了持久化类与表的照射关系,OEnclaveM框架在运行时就能参考映射文件的音讯,把目的持久化到数据库中。

此时此刻OOdysseyM框架主要有多样:Hibernate(Nhibernate),iBATIS,mybatis,EclipseLink,JFinal。

元数据:是讲述别的数据的数据 (data about other data)

 肆 、增加和删除改对超级缓存的震慑

1 @Test
2     public void test03() {
3         Student student = dao.selectStudentById(197); 
4         System.out.println(student);
5         //增删改操作都会清空一级缓存
6         dao.insertStudent(new Student("阿古斯",26,96.5));
7         Student student1 = dao.selectStudentById(197); 
8         System.out.println(student1);
9     }

输出:

0 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentById  - ==>  Preparing: select id,name,age,score from student where id=? 
75 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentById  - ==> Parameters: 197(Integer)
116 [main] TRACE com.jmu.dao.IStudentDao.selectStudentById  - <==    Columns: id, name, age, score
116 [main] TRACE com.jmu.dao.IStudentDao.selectStudentById  - <==        Row: 197, 明明, 19, 87.9
120 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentById  - <==      Total: 1
Student [id=197, name=明明, score=87.9, age=19]
121 [main] DEBUG com.jmu.dao.IStudentDao.insertStudent  - ==>  Preparing: insert into student(name,age,score) values(?,?,?) 
122 [main] DEBUG com.jmu.dao.IStudentDao.insertStudent  - ==> Parameters: 阿古斯(String), 26(Integer), 96.5(Double)
123 [main] DEBUG com.jmu.dao.IStudentDao.insertStudent  - <==    Updates: 1
124 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentById  - ==>  Preparing: select id,name,age,score from student where id=? 
124 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentById  - ==> Parameters: 197(Integer)
124 [main] TRACE com.jmu.dao.IStudentDao.selectStudentById  - <==    Columns: id, name, age, score
125 [main] TRACE com.jmu.dao.IStudentDao.selectStudentById  - <==        Row: 197, 明明, 19, 87.9
125 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentById  - <==      Total: 1
Student [id=197, name=明明, score=87.9, age=19]

结论:增删改操作都会清空一级缓存,无论是否提交

  

 5、内置二级缓存

(1)二级缓存的打开

     

MyBatis的利用二级缓存的指标是为了以免万一同一查询(相同Sql
id、相同的Sql语句)的累累实践。

Hibernate中的缓存正是为着在四个查询间共享查询结果(全体查询中倘若查询结果中留存改目的的,就径直从缓存中读取)

MyBatis内置的二级缓存为org.apache.ibatis.cache.Impl.PerpetualCache.

 首先,注解二级缓存的存在。

因为SqlSession一旦关闭,超级缓存就不存在,而二级缓存的生命周期会与任何应用同步,与SQLSession是还是不是关闭非亲非故。

sqlSession.close();

打开内置的二级缓存步骤:

  1. 对实体进行类别化XML 7
  2. 在炫耀文件中添加<cache/>标签;

缓存命中率:

【DEBUG】 Cache Hit Ratio:0.5

(2)增加和删除改对二级缓存的熏陶

 1 public void test01() {
 2         sqlSession = MybatisUtils.getSqlSession();
 3         dao = sqlSession.getMapper(IStudentDao.class);
 4         Student student = dao.selectStudentById(197);
 5         System.out.println(student);
 6         
 7         sqlSession.close();
 8         
 9         sqlSession = MybatisUtils.getSqlSession();
10         dao = sqlSession.getMapper(IStudentDao.class);
11         
12         dao.insertStudent(new Student("",0,0));
13         
14         Student student1 = dao.selectStudentById(197);
15         System.out.println(student1);
16     }

 

XML 8

 

XML,上边的事例表明:

  1. 增加和删除改同样会清空二级缓存;
  2. 对于二级缓存的清空,实际上是对所查找key对应的value置为null,而非将<key,value>对,即Entry对象删除
  3. 从DB中再次开始展览select查询的标准是:A、缓存中根本不设有这几个key;B、缓存中存在改key所对应的Entry对象,但其value为null

(3)二级缓存的配置

  • size:二级缓存中能够存放的最多指标个数,默许为102八个。(实际上就是HashMap的尺寸,可以放多少Entry对象)
  • eviction:逐出策略。当二级缓存中的对象达到最大值时,就供给通过逐出策略将缓存中的对象移出缓存。暗中同意为LRU。常用的策略有:FIFO(First
    in First out)先进先出、LRU(Least Recently
    Used)未被运用时间最长的。
  • flushInterval:刷新缓存的光阴间隔,单位纳秒。那里的刷新缓存即清空缓存。一般不点名,即当执行增删改时刷新缓存。
  • readOnly:设置缓存中数据是还是不是只读。默许false。

(4)二级缓存的关门

(1)全局关闭

<settings>
        <!-- 关闭二级缓存 -->
        <setting name="cacheEnabled" value="false" />
    </settings>

(2)局地关闭

XML 9

(5)二级缓存的采用条件

 

  1. 三个namespace不要操作同一张表
  2. 毫无在事关关系表上执行增加和删除改操作(3个namespace一般对同2个表,若表间存在关联关系,也就表示同2个表恐怕会冒出多个namespace。若里面叁个namespace对表举办增加和删除改操作而影响到了其关联表数据,而以此关联表的多少修改之后刷新当前namespace下的二级缓存,而对另三个namespace下的二级缓存数据没有影响)
  3. 查询多于修改时选用二级缓存

相关文章

网站地图xml地图