java mvc 清除项目缓存 清空java缓存_java mvc 清除项目缓存


四、缓存

缓存的重要性是不言而喻的。将相同查询条件的SQL语句执行一遍后所得到的结果存在内存或者某种缓存介质当中,当下次遇到一模一样的查询SQL时候不在执行SQL与数据库交互,而是直接从缓存中获取结果,减少服务器的压力;尤其是在查询越多、缓存命中率越高的情况下, 使用缓存对性能的提高更明显。

MyBatis允许使用缓存,缓存一般放置在高速读/写的存储器上,比如服务器的内存,能够有效的提供系统性能。MyBatis分为一级缓存和二级缓存,同时也可配置关于缓存设置。

一级存储是SqlSession上的缓存,二级缓存是在SqlSessionFactory上的缓存。默认情况下,MyBatis开启一级缓存,没有开启二级缓存。当数据量大的时候可以借助一些第三方缓存框架或Redis缓存来协助保存Mybatis的二级缓存数据。


java mvc 清除项目缓存 清空java缓存_二级缓存_02


4.1 一级缓存

一级存储是SqlSession上的缓存,默认开启,不要求实体类对象实现Serializable接口。下面在没有任何配置的情况下,测试一级缓存。


public


java mvc 清除项目缓存 清空java缓存_mybatis缓存_03


从输出结果可以看出,两次执行mapper.findEmp3("C", "CLERK");语句,只访问了一次数据库。第一次执行该SQL语句,结果缓存到一级缓存中,后续执行相同语句,会使用缓存中缓存的数据,而不是对数据库再次执行SQL,从而提高了查询效率。

4.2 二级缓存

二级缓存是SqlSessionFactory上的缓存,可以是由一个SqlSessionFactory创建的SqlSession之间共享缓存数据。默认并不开启。下面的代码中创建了两个SqlSession,执行相同的SQL语句,尝试让第二个SqlSession使用第一个SqlSession查询后缓存的数据。


public


注意其中的commit(),执行该命令后才会将该SqlSession的查询结果从一级缓存中放入二级缓存,供其他SqlSession使用。另外执行SqlSession的close()也会将该SqlSession的查询结果从一级缓存中放入二级缓存。两种方式区别在当前SqlSession是否关闭了。


java mvc 清除项目缓存 清空java缓存_缓存_04


执行结果显示进行了两次对数据库的SQL查询,说明二级缓存并没有开启。需要进行如下步骤完成开启。

1) 全局开关:在mybatis-config.xml文件中的<settings>标签配置开启二级缓存


<settings>
    <setting name="cacheEnabled" value="true"/>
</settings>


cacheEnabled的默认值就是true,所以这步的设置可以省略。

2) 分开关:在要开启二级缓存的mapper文件中开启缓存:


<mapper namespace="com.bjsxt.mapper.EmployeeMapper">
    <cache/>
</mapper>


3) 缓存中存储的JavaBean对象必须实现序列化接口


public class Employee implements  Serializable { }


经过设置后,查询结果如图所示。发现第一个SqlSession会首先去二级缓存中查找,如果不存在,就查询数据库,在commit()或者close()的时候将数据放入到二级缓存。第二个SqlSession执行相同SQL语句查询时就直接从二级缓存中获取了。


java mvc 清除项目缓存 清空java缓存_java mvc 清除项目缓存_05


注意:

1) MyBatis的二级缓存的缓存介质有多种多样,而并不一定是在内存中,所以需要对JavaBean对象实现序列化接口。

2) 二级缓存是以 namespace 为单位的,不同 namespace 下的操作互不影响

3) 加入Cache元素后,会对相应命名空间所有的select元素查询结果进行缓存,而其中的insert、update、delete在操作是会清空整个namespace的缓存。

4) 如果在加入Cache元素的前提下让个别select 元素不使用缓存,可以使用useCache属性,设置为false。


<select id="findEmp3" resultType="employee"  
flushCache="false" useCache="false" >


5) cache 有一些可选的属性 type, eviction, flushInterval, size, readOnly, blocking。


<cache  type="" readOnly="" eviction="" 
flushInterval="" size="" blocking=""/>


java mvc 清除项目缓存 清空java缓存_java mvc 清除项目缓存_06


6) 缓存相关API

² 缓存的功能由根接口org.apache.ibatis.cache.Cache定义。整个体系采用装饰器设计模式

² 数据存储和缓存的基本功能由org.apache.ibatis.cache.impl.PerpetualCache永久缓存实现,其底层采用了HashMap结构来存储缓存信息。

² 通过一系列的装饰器来对PerpetualCache永久缓存进行缓存策略等方便的控制,


java mvc 清除项目缓存 清空java缓存_缓存_07


7) 查询数据顺序

a) 二级缓存

b) 一级缓存

c) 数据库

d) 把数据保存到一级

e) 当SqlSession关闭或者提交的时候,把数据刷入到二级缓存中

作业

1. MyBatis的一级、二级缓存的工作层次,默认开启情况

2. MyBatis如何启用二级缓存

3. MyBatis缓存的查询顺序