一.延迟加载
1.什么是延迟加载?
延迟加载(lazy load)是(也称为懒加载),延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作
可以简单理解为,只有在使用的时候,才会发出sql语句进行查询。
2.延迟加载分三种
(1)直接加载(执行完主加载后马上执行关联对象的查询)
lazyLoadingEnabled=false,(默认情况下)
aggressiveLazyLoading=true
(2)侵入式延迟加载(执行主加载是,不会执行关联对象的查询)
lazyLoadingEnabled=true
lazyLoadingEnabled=true
(3)深度延迟
lazyLoadingEnabled=true
lazyLoadingEnabled=false
配置延迟加载
"cacheEnabled" value="true">
二.缓存(一级缓存和二级缓存)
1.什么是缓存?
缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找。由于缓存的运行速度比内存快得多,故缓存的作用就是帮助硬件更快地运行
现在我们探讨的缓存是在内存中,缓存数据保存在内存中
查询缓存:应用服务器内存中,主要是为了提高查询访问速度
2.缓存的分类
MyBatis根据缓存区的作用于与申明周期分为:一级缓存和二级缓存
无论是一级缓存还是二级缓存都是按照namespace进行分别存放
不同之处在于SqlSessiion的关闭一级缓存也会不存在,一级缓存在同一线程内有效,二级缓存是在不同SqlSession中共享数据
3.一级缓存的存在性证明
Mybatis缓存的底层实现的Map,他的查询依据是:sql的id+sql语句
增删改操作会对缓存造成影响,会清空一级缓存
首先,在大配置中设置
"cacheEnabled" value="true">
//证明一级缓存的存在性 @Test public void firstLevelHasExist(){ SqlSession sqlSession = MyBatisUtil.getSession(); IDeptDao mapper = sqlSession.getMapper(IDeptDao.class); Dept dept = mapper.getEmpByDeptNoMultiSQL(1); System.out.println("部门名称:"+dept.getDeptName()); //证明一级缓存的存在性 System.out.println("分割线======================="); Dept dept2 = mapper.getEmpByDeptNoMultiSQL(1); System.out.println("部门名称:"+dept2.getDeptName()); sqlSession.close(); }
运行结果如下
只发送了一次sql语句
现在添加一个对象
@Test public void firstLevelHasExist(){ SqlSession sqlSession = MyBatisUtil.getSession(); IDeptDao mapper = sqlSession.getMapper(IDeptDao.class); Dept dept = mapper.getEmpByDeptNoMultiSQL(1); System.out.println("部门名称:"+dept.getDeptName()); //证明一级缓存的存在性 Dept d1=new Dept(); d1.setDeptName("运营部"); mapper.addDept(d1); System.out.println("分割线======================="); Dept dept2 = mapper.getEmpByDeptNoMultiSQL(1); System.out.println("部门名称:"+dept2.getDeptName()); sqlSession.close(); }
发送了两次sql语句,所以增删改会清空缓存
4.二级缓存
//证明二级缓存的存在性 @Test public void secondLevelHasExist(){ SqlSession sqlSession = MyBatisUtil.getSession(); IDeptDao mapper = sqlSession.getMapper(IDeptDao.class); Dept dept = mapper.getEmpByDeptNoMultiSQL(1); System.out.println("部门名称:"+dept.getDeptName()); sqlSession.close(); System.out.println("===========二级缓存============"); SqlSession sqlSession2 = MyBatisUtil.getSession(); IDeptDao mapper2 = sqlSession2.getMapper(IDeptDao.class); Dept dept2 = mapper2.getEmpByDeptNoMultiSQL(1); System.out.println("部门名称:"+dept2.getDeptName()); sqlSession2.close(); }
这是两个线程
4.配置第三方缓存EhCache
第一步:首先要引入jar包
net.sf.ehcache ehcache 2.10.4 org.mybatis.caches mybatis-ehcache 1.1.0
第二步:在小配置(接口对应的xml文件)中添加
"org.mybatis.caches.ehcache.EhcacheCache"/>
在这个节点中还有其他的一些属性,
第三步:在resources目录下写入文件ehcache.xml文件
文件中的内容,直接复制下面的代码就可以
"java.io.tmpdir"/> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" /> "sampleCache1" maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600" overflowToDisk="true" /> "sampleCache2" maxElementsInMemory="1000" eternal="true" timeToIdleSeconds="0" timeToLiveSeconds="0" overflowToDisk="false" /> -->