同一个会话期间只要查询过的数据都会被保存在当前SqlSession的一个Map中
- key:hashCode+查询的SqlId+编写的sql查询语句+参数java
同一个SqlSession两次查询期间手动清空了缓存。sql
eviction="FIFO" :缓存回收策略
- LRU(最近最少使用):移除最长时间不被使用的对象。
- FIFO(先进先出):按对象进入缓存的顺序来移除对象。
- SOFT(软引用):移除基于垃圾回收期状态和软引用规则的对象。
- WEAK(弱引用):更积极地移除基于垃圾收集器状态和弱引用规则的对象。
- 默认的是LRU数据库
flushInterval:刷新间隔,单位毫秒
- 默认状况下不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。缓存
size:引用数目,正整数
- 表明缓存最多能够存储多少个对象,太大容易致使内存溢出tomcat
readOnly:只读,true/false
- true:只读缓存;会给全部调用者返回缓存对象的相同实例。这些对象不能被修改。这提供了很重要的性能优点。
- false:读写缓存,会返回缓存对象的拷贝(经过序列化)。这会慢一些,可是安全,默认为false。安全
全局setting的cacheEnable
- 配置二级缓存的开关,一级缓存一直是打开的。session
select标签的useCache属性
- 配置这个select是否使用二级缓存。一级缓存一直是使用的。mybatis
sql标签的flushCache属性:
- 增删改默认为true,sql执行后,会清空一级和二级缓存。查询默认false。app
sqlSession.claerCache()
- 用来清除一级缓存性能
当在某一个做用域(一级缓存/二级缓存/Namespace)进行了增删改操做化,默认该做用域下全部select中的缓存将被clear。
@Intercepts({ @Signature(type=StatementHandler.class,method="prepare", args={Connection.class}) }) public class MyPlugin implements Interceptor{}
<plugins> <plugin interceptor="com.desperado.plugin.MyPlugin"> <property name="username" value="tomcat"/> </plugin> </plugins>
//1.分离代理对象。因为会造成屡次代理,因此须要经过while循环分离出最终被代理的对象,从而方便提取信息。 MetaObject metaObject = SystemMetaObject.forObject(target); while(metaObject.hasGetter("h")){ Object h = metaObject.getValue("h"); metaObject = SystemMetaObject.forObject(h); } //2.获取到代理对象中包含的被代理的真实对象 Object obj = metaObject.getValue("target"); //3.获取被代理对象的MetaObject方便进行信息提取 metaObject forObject = SystemMetaObject.forObject(obj);
默认的openSession()方法没有参数,使用它建立的SqlSession具备以下特性:
- 会开启一个事务(也就是 不自动提交)
- 链接对象会从由活动环境配置的数据源实例获得。
- 事务隔离级别将会使用驱动或数据源的默认设置。
- 预处理语句不会被复用,也不会批量处理更新。
openSession方法的ExecutorType类型的参数,枚举类型,取值以下:
- SIMPLE:这个执行器类型不作特殊的事情(这是默认装配的)。它为每一个语句的执行建立一个新的预处理语句。
- REUSE:这个执行器类型会复用预处理语句。
- BATCH:这个执行器会批量执行全部更新语句。
批量操做就是使用MyBatis提供的BATCH类型的Executor进行的,它的底层就是经过暂存sql的方式进行的。能够保存sql到必定数量后发给数据库执行一次。
与Spring整合中。推荐额外配置一个能够专门用来执行批量操做的sqlSession,须要使用的时候,注入配置的批量操做的SqlSession,经过它获取到mapper映射器进行操做。
途观想让其提早执行,可使用sqlSession.flushStatements()方法,让其执行刷到数据库中进行执行。
<select id="callProcedure" statementType="CALLABLE"> call procedure_name(#{param1},#{param2}) </select>