缓存:内存中的一块存储空间,用于存放多个用户反复查询数据,有了缓存之后
后续的查询数据都会直接从缓存中获取
3、使用缓存的好处:
减少每次使用链接的占用,提升查询效率,
提升程序的运行效率
4、使用缓存的缺点:
占用大量的内存资源(成本高)
5、缓存的机制:
以空间换时间(效率)
==============================================================================
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开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-CdIDGPt2-1710833689562)]
[外链图片转存中…(img-dU3ujhEz-1710833689562)]
[外链图片转存中…(img-81W2hejP-1710833689563)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-DiL4PVSA-1710833689563)]