10.1 缓存介绍:
缓存就是内存中的一个对象,用于对数据库查询结果的保存.好处减少与数据库
交互次数提高响应速度.
10.2 什么是会话
会话就是一次完整的交流.在一次完整交流过程中往往包含多次请求响应.
而发送请求都是同一个用户.SqlSession就是在用户与数据库进行一次会话过程中使用的接口.
10.3 MyBatis缓存分类
- 一级缓存:
也称为[本地缓存],用于保存用户在一次会话过程中查询的结果.用户一次会话中
只能使用一个SqlSession.一级缓存是自动开启,不允许关闭 - 二级缓存:
也称为[全局缓存],是针对某一个表的查询结果存储.可以共享给所有针对这张表查询的用户,也就是说可以在多个SqlSession之间共享.
10.4 一级缓存失效原因: - 用户在一次会话过程中使用了多个SqlSession
- 用户在会话中使用同一个SqlSession,但是查询条件发生了变化
- 用户在会话中使用同一个SqlSession,但是清理了缓存
- 用户在会话中使用同一个SqlSession,但是在两次查询之间对数据库进行了修改
10.5 二级缓存开启设置
-
需要在MyBatis核心配置文件,通过settings标签开发二级缓存.
-
在对应Mapper文件中添加<cache></cache>
-
设置<cache>标签属性
设置对应的实体类实现序列化接口
一。myBatis框架中缓存分类:
一级缓存:
[会话缓存]。在当前用户访问数据库期间,所有的查询结果都会自动
保存起来。用户可以使用SqlSession从一级缓存中进行读取。
而其他用户的SqlSession是不能读取当前用户的一级缓存
一级缓存自动开启,开发人员是不能关闭一级缓存
二级缓存:
【全局缓存】,
1.二级缓存针对某一个表来设置的共享缓存
2.如果一个SqlSession对象将要被销毁时,MyBatis框架
自动将这个SqlSession中与当前表关联的数据存放到这个共享缓存中.
3.那么此时其他SqlSession如果需要得到相同的数据,就可以到共享缓存中
读取
4.由于二级缓存对于服务端内存消耗较大,因此MyBatis框架是不会主动
开发二级缓存,需要开发人员手动开启二级。
二。一级缓存失效原因:
1.同一个用户,使用两个SqlSession,是看不到一级缓存工作。
2.在一个SqlSession,使用查询条件不同,也会导致一级缓存失效
select * from dept where deptno=10 结果1
select * from dept where deptno=20 结果2
3.在一个SqlSession使用相同查询条件此时在查询之间进行数据修改操作导致一级缓存刷新(清空)
4.在一个SqlSession使用相同查询条件此时手动刷新缓存时导致一级缓存失败
三。与MyBatis中【一级缓存】和【二级缓存】关联的属性
1.全句变量:核心配置文件
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
1)cacheEnabled[默认值就是true]: 表示开启二级缓存
2)cacheEnabled=false, 关闭二级缓存。一级缓存依然存在
2.useCache: mapper.xml 会在<select>出现属性
<select id="findDeptByNo" resultType="dept" useCache="true">
1)useCache只出现在<select>
2)useCache默认值就是true
3)userCache设置false时,对于一级缓存没有任何影响
此时第一个SqlSession与当前查询语句
关联的结果,在第一个SqlSession关闭时
是不会放到二级缓存中。
3.flushCache:mapper.xml
1)flushCache会出现【添加,更新,删除,查询】标签
2)flushCache属性决定当前SQL执行完毕后,是否会刷新(清空)缓存
3)flushCache在【添加,更新,删除】标签中,默认值true
(清空一级缓存数据/清空二级缓存对应的mapper.xml所有数据)
4)flushCache在【添加,更新,删除】标签中,设置为false
(清空一级缓存数据/不会清空二级缓存数据)
5)flushCache也可以在【查询标签出现】,默认值false
(一级缓存和二级缓存都可以使用)
6)flushCache在查询标签中设置为true。(查询结果不会保存到一级缓存和二级缓存)
4.sqlSession.clearCache(): 只会清空当前会话的一级缓存。不会影响数据保存到二级缓存
MyBatis框架中事务管理方式
一。什么事务
就是数据库一个备份方案
二。JDBC 如何控制事务
connection.setAutoCommit(false);
通知数据库,只要是从这个通道推送的sql语句
当做一个整体处理,只做一次备份。对于操作的结果是否是提交还是回滚
由当前通道说得算。
try{
ps.addBatch();
con.commit();
}catch(SQLException ex){
con.rollback()
}
三。MyBatis框架对于事务管理方式:
1.MyBatis框架中亲自完成JDBC事务管理细节
2.把事务管理细节交给管理MyBatis框架的其他框架(Spring)
四。Transaction接口:
getConnection(): 获得connection
close(): 关闭或则返还connection
commit(): 提交事务
rollback(): 事务回滚
五 Transaction接口的实现类:
1.JDBCTransaction:MyBatis亲自实现事务管理细节
2.ManagedTransaction:委托其他框架来提供事务管理细节