1.缓存:暂时的存储一些数据,加快系统的查询速度。
2.CPU:
主频:4-2.7GHZ
内存:4G-8G 1333MHZ
(相当于缓存区,把硬盘的一些东西存起来)
CPU:一级缓存(4MB)
二级缓存(16MB)
放马上处理的东西。
给前端放个缓存数据库, 直接数据放在内存中。
不像mysql数据库,数据放在硬盘内,进行io读写。
如果1号员工,不经常修改。
把上次查询的数据,暂时放在一些地方。 避免跟数据库交互。
MyBaits缓存机制:Map;能保存查询出的一些数据。
跟数据库获取连接,发送sql,封装成结果,
这一系列操作,直接从map中拿好。
一级缓存
:线程级别的缓存,本地缓存,(sqlSession级别的缓存),默认
1.跟数据库的一次会话,开启一个新的sqlSession,开启一次新的连接,就有一个一级缓存。
2. 如果有新的会话,就有新的一级缓存。
当前会话的线程内,会有一个map,帮你存数据。
只有在同一个sqlSession期间,查询到的数据,会保存在这个sqlSession缓存中。
下次使用sqlSession查询,就会存缓存中拿。
缓存失效:
不同的会话,不同的一级缓存。
明显发新的sql
2.sqlsession期间执行任何一个增删改操作,会把缓存清空。
为什么mybaits会清空缓存,是因为怕改了旧数据。
修改生效,关连接(close)之前,要提交(commit)。
3.手动清缓存,
调用clearCache(),他只是清空一级缓存。
清空当前sqlSeession的一级缓存。
缓存没有了,就会发新的sql了。
Cache接口,用的就是PerpetualCache实现类。缓存其实是个map。
然后put方法,放在一级缓存。
key是啥?
二级缓存:
一个用户一个sqlSession其实没有解决根本性问题。
全局范围的缓存。namespace级别。
除了当前线程。
当前会话SqlSession能用外,其他也可以使用。
一级缓存查的数据,别扔,放在二级缓存中。
以前是会话一关,整个缓存(map)就销毁了。
二级缓存,在SqlSession关闭或提交之后才会生效。
mybatis默认没有使用。
mybatis全局配置。cacheEnabled。开启全局缓存开关
还要说明哪些dao需要二级缓存。
mybatis-config.xml
在mapper文件加个cache标签。
test:
序列化异常:要实现mybatis二级缓存,你这javabean要实现序列化接口。
缓存相关属性
eviction 缓存回收策略
LRU:最近最少使用
FIFO: 先进先出
SOFI:软引用
WEAK:弱引用
size:缓存多少对象
readOnly:只读缓存。对象的引用给你。
关系
每此那么多的会话(sqlSession),自带一级缓存。
Dao带着二级缓存。
一级缓存关闭了。就把数据放在二级缓存了。
1.select标签,也有一个useCache,是看是否使用二级缓存。
2.增删改标签,有个flushCache。
同时清空一级还有二级缓存。
整合第三方缓存
1.写一个MyCache 实现Cache接口。
2.new一个redis
3.put方法,然后数据放在redis里面,不放在map里面。
4.get方法,然后数据从redis里面拿。
mybatis执行的时候。
1.默认会话先进来。
2.Executor:执行增删改查的执行器。
3.CachingExecutor:先来看二级缓存中有没有数据。如果没有再调用Executor增删改查。
4.Executor想要执行增删改查,要看一级缓存中有没有。
没有的话,查数据库,查到了就放到二级缓存。
mybatis缓存就是一个map,于是把它搞成接口,Cache接口。
ehcache非常专业的java进程内的缓存框架
1.
2.ehcache配置文件
文件名:ehcache.xml,放在类路径下。
3.Dao的mapper文件下,
cache标签 type指定这个缓存框架。