Mybatis 缓存

mybatis 一级缓存

一级缓存也叫本地缓存,MyBatis 的一级缓存是在会话(SqlSession)层面进行缓存的。 MyBatis 的一级缓存是默认开启的,不需要任何的配置。

1.1一级缓存的生命周期
MyBatis 在开启一个数据库会话时,会创建一个新的 SqlSession 对象,SqlSession 对象中 会有一个新的 Executor 对象。Executor 对象中持有一个新的 PerpetualCache 对象;当会 话结束时,SqlSession 对象及其内部的 Executor 对象还有 PerpetualCache 对象也一并释 放掉。
如果 SqlSession 调用了 close()方法,会释放掉一级缓存 PerpetualCache 对象,一级缓存 将不可用。 如果 SqlSession 调用了 clearCache(),会清空 PerpetualCache 对象中的数据,但是该对象 仍可使用。
SqlSession 中执行了任何一个 update 操作(update()、delete()、insert()) ,都会清空 PerpetualCache 对象的数据,但是该对象可以继续使用。

点击查看代码
package test;

import com.bjsxt.pojo.Users;
import com.bjsxt.service.UsersService;
import com.bjsxt.service.impl.UsersServiceImpl;
import com.bjsxt.utils.MybatisUtil;
import org.apache.ibatis.session.SqlSession;

public class test_10_CacheOne {
    public static void main(String[] args) {
        UsersService usersService = new UsersServiceImpl();
        Users users = usersService.selectUsersById(1);
        System.out.println(users.toString() );
        //加上下面的语句,缓存会被清空,又会调用查询语句
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        sqlSession.clearCache();
        Users users1 = usersService.selectUsersById(1);
        System.out.println(users1);
    }
}

image

mybatis 二级缓存

MyBatis 的二级缓存是 Application 级别的缓存,它可以提高对数据库查询的效率,以提 高应用的性能。二级缓存是 SqlSessionFactory 上的缓存,可以是由一个 SqlSessionFactory 创 建的不同的 SqlSession 之间共享缓存数据。默认并不开启。 SqlSession 在执行 commit()或者 close()的时候将数据放入到二级缓存。

2.1二级缓存的配置方式
二级缓存的开启需要进行配置,实现二级缓存的时候,MyBatis 要求缓存的 POJO 必须 是可序列化的, 也就是要求实现 Serializable 接口。在映射配置文件中配置就可以 开启缓存了。
2.2二级缓存特点
 映射语句文件中的所有 select 语句将会被缓存。
 映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。
 二级缓存是以 namespace 为单位的,不同 namespace 下的操作互不影响  如果在加入标签的前提下让个别 select 元素不使用缓存,可以使用 useCache 属性,设置为 false。
 缓存会使用默认的 Least Recently Used(LRU,最近最少使用的)算法来收回。
 根据时间表,比如 No Flush Interval,(CNFI 没有刷新间隔),缓存不会以任何时间顺序 来刷新。
 缓存会存储列表集合或对象(无论查询方法返回什么)的 1024 个引用
 缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是共享的,而且可以 安全的被调用者修改,不干扰其他调用者或线程所做的潜在修改。

2.3cache 标签的可选属性
image

2.4.1 配置 cacheEnabled 在 mybatis-config.xml 文件中的<'settings>标签配置开启二级缓存。cacheEnabled 的默认 值就是 true,所以这步的设置可以省略。

点击查看代码
<settings> <setting name="cacheEnabled" value="true"/> </settings>

2.4.2 在映射配置文件中添加<'cache/>
点击查看代码
<mapper namespace="com.bjsxt.mapper.UsersMapper"> <cache/> </mapper>

2.4.3 JavaBean 对象必须实现序列化接口
点击查看代码
public class Users implements Serializable{}

测试代码

点击查看代码
package test;

import com.bjsxt.pojo.Users;
import com.bjsxt.service.UsersService;
import com.bjsxt.service.impl.UsersServiceImpl;
import com.bjsxt.utils.MybatisUtil;
import org.apache.ibatis.session.SqlSession;

public class test_11_CacheTwoTest {
    public static void main(String[] args) {
        UsersService usersService = new UsersServiceImpl();
        Users users = usersService.selectUsersById(1);
        System.out.println(users);
        //这里就算关闭了sqlsession,下次还是重缓存里面查看
        MybatisUtil.closeSqlSession();
        System.out.println("--------------------");
        MybatisUtil.getSqlSession();
        Users users1 = usersService.selectUsersById(1);
        System.out.println(users1);
    }
}

image

posted @ 2021-11-27 10:07  风的指引  阅读(170)  评论(0)    收藏  举报