千锋教育2023版Java面试宝典Java面试200题(含美团、字节、阿里大厂真

一级缓存属于sqlsession级别,默认开启,就是如果使用同一个sqlsession获取的DAO代理对象是同一个,如果去做相同的查询,只会向数据库查询一次,一旦做了update等操作将使一级缓存失效,一级缓存是baseExecutor,底层实现是一个Map<Cachekey,list>,缓存类型是Prepetualcache.localCache,Cachekey=全限定+sql语句+参数+数据库类型,list就是命中的数据,是直接将整个对象存入。
二级缓存默认情况下是关闭状态,需要开发人员手动开启,同时缓存的级别属于sqlsessionFactory级别,二级缓存做了序列化,导致前后对象不一致。二级缓存开启步骤,第一步在主配置文件中设置cacheEnabled,将value值设置为true,第二步则是在映射文件中设置<cache/>,第三步则是在映射文件中需要缓存的查询标签上加上usecache = true;第四步则是对实体类实现serializable。同时二级缓存的出现是为了解决一级缓存的弊端,在SSM整合之后,表现层调用业务层,业务层调用持久层,相当与表现层的每一次请求都会获取一个新的sqlsession,一级缓存就失效了,但是如果进行事务控制的话,那么一级缓存不会失效,二级缓存底层与属性的get方法有关;二级缓存也有缺点,如果当前操作是多表查询,多个表联合查询,查询之后结果也会缓存,如果多线程场景下,另外一个线程将多表中的某个表做了更新之后,就会引发脏读,解决方案就是共享mapper<cache-ref>设置共享的地址,二级缓存的内部既是委派又是责任链,二级缓存的单位是mapper,每个mapper都是独立的缓存,也叫独立的会话,缓存空间底层也是map,TransactionalCache暂存区(存储一些未命中的数据)每次commit会更新次区域,TransactionalCacheManager暂存区管理器,负责暂存区与缓存空间映射。