mybatis的缓存机制,java面试算法大全

缓存:内存中的一块存储空间,用于存放多个用户反复查询数据,有了缓存之后

后续的查询数据都会直接从缓存中获取

3、使用缓存的好处:

减少每次使用链接的占用,提升查询效率,

提升程序的运行效率

4、使用缓存的缺点:

占用大量的内存资源(成本高)

5、缓存的机制:

以空间换时间(效率)

二、mybatis缓存

==============================================================================

1、mybatis的缓存机制

(1)一级缓存 基于sqlSession的缓存【默认开启】
  • 一级缓存:也称为本地缓存,用于保存用户在一次会话过程中查询的结果,用户一次会话中只能使用一个sqlSession,一级缓存是自动开启的,不允许关闭。

注意:查询语句最后都是关闭资源,如果不关闭资源数据会出现闪动

不关闭资源,第一次查询四条,第二次5条,SqlSession.close()关闭资源就是为了关闭sqlSession的缓存

一级缓存的特点:

1、查询第一次时,获取到数据写入一级缓存,再次查询时从缓存获取,不再执行sql语句

2、若当前SqlSession发生修改、增加、删除动作时,就会立即把当前缓存的所有数据清空

3、对于查询操作,只要SqlSession没有调用flush或者close方法,它就一直存在

注意:一次缓存造成查询数据结果闪动

(2)二级缓存:基于mapper的缓存(基于指定实体类的缓存)(末默认不开启)

二级缓存是mapper映射级别的缓存,多个SqlSession去操作同一个mapper映射的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。(也可以说是,在同一namespace下,共享一块缓存空间,如果多个mapper (dao.xml)共享同一namesapce 则也共享一块缓存,二级缓存是跨sqlsession,多个sqlsession可以去二级缓存获取数据。即可以针对同一个dao接口或者同一个命名空间(namespace)创建多个SqlSession )

二级缓存特点:

1、只要发生增删改,就会将·同一命名空间(namespace)下的缓存清空

2、使用二级缓存实体类必须实现序列化,否则报错

3、使用查询语句,默认只写入一级缓存,只有调用close(),commit()方法,

才会将数据提交到二级缓存,其他的sqlsession才能拿到,不再执行sql语句

2、二级缓存 开启手工设置

1、在Mybatis框架中声明 使用二级缓存 在mybatis-config.xml中配置

mybatis-config.xml中

mybatis-config.xml:

注意:

2、在需要进行缓存的操作Mapper中指定使用缓存 在mapper文件中声明

3、要缓存的实体类必须实现序列化接口(实体类中)

public class User implements Serializable {

private Integer id;

private String username;

private String password;

private Integer age;

private Date birthday;

  • 实体类实现序列化接口的原因:

数据的数据唤出:长时间不用的放到缓存文件里

在这里插入图片描述

数据的唤入:当再次使用时,

4、缓存测试

1、在mybatis工具类中重写一个执行sqlSession的方法:

作用:用于测试缓存,实际开发不使用

//mybatisUtil.java 工具类

public class MybatisUtil {

/**

  • 线程绑定对象,保证是同一个对象

*/

private static final ThreadLocal t1 = new ThreadLocal<>();

private static SqlSessionFactory factory;

static {

InputStream is = null;

try {

is = Resources.getResourceAsStream(“mybatis-config.xml”);

} catch (IOException e) {

e.printStackTrace();

}

factory = new SqlSessionFactoryBuilder().build(is);

}

/**

  • 创建SqlSession

  • @return sqlSession

*/

private static SqlSession openSession() {

SqlSession sqlSession = t1.get();

if (sqlSession == null) {

sqlSession = factory.openSession();

t1.set(sqlSession);

}

return sqlSession;

}

/**

  • 仅用于测试缓存 每次调用方法获取的都是全新的连接 实际开发不使用

  • @return sqlSession

*/

public static SqlSession getSqlSession(){

return factory.openSession();

}

/**

  • 调用功能方法

  • @param clazz

  • @return Object

*/

public static Object getMapper(Class clazz) {

return openSession().getMapper(clazz);

}

/**

  • 关闭资源

*/

public static void close() {

if (openSession() != null) {

openSession().close();

}

t1.remove();

}

/**

  • 提交事务,关闭资源

*/

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-CdIDGPt2-1710833689562)]
[外链图片转存中…(img-dU3ujhEz-1710833689562)]
[外链图片转存中…(img-81W2hejP-1710833689563)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-DiL4PVSA-1710833689563)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值