mybatis一级和二级缓存及第三方缓存

    技术2022-07-12  83

    一级缓存 SqlSession级别:默认开启 1.同一个sqlSession下相同条件查询,第二次查询直接从内存中的缓存去

    2.同一个sqlSession下不同条件查询,第二次从数据库查

    3.不同的sqlSession,相同的条件查询,两次都从数据库查

    4.同一个sqlSession下相同条件查询,两次查询中间任意一次增删改(还是同一个sqlSession),第二次从数据库查

    5.同一个sqlSession下相同条件查询,中间执行一次sqlSession.clearCache(),第二次从数据库查

    二级缓存 Mapper级别:namespace级别,只对开启了的Mapper有效,需要手动开启 1.在sqlmap-config.xml中settings(要放到environments 标签前面)标签中添加

    <setting name="cacheEnabled" value="true"/>

    2.在xdlUserMapper.xml的mapper标签下添加

    <cache/>

    3.二级缓存有效的前提是前一个SqlSession关闭或commit,否则sqlSession级别的一级缓存无法进入二级缓存

    1)cache里的一些属性,type属性是第三方缓存 2)xdlUserMapper.xml中sql标签中的一些属性:

    3.实体类实现Serializable接口

    注意:二级缓存生效前提是sqlSession关闭或者提交,可以每次sql查询后, sqlSession.commit();

    第三方缓存 企业一般用

    1.导jar包 2.xdlUserMapper.xml的mapper标签下

    <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

    3.项目下导入ehcache.xml文件

    <?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" updateCheck="false"> <!--当超过maxElementsInMemory值时,会将数据写入到本地文件--> <diskStore path="D:\projects\encache" /> <defaultCache eternal="false" maxElementsInMemory="1000" overflowToDisk="true" diskPersistent="false" timeToIdleSeconds="120" timeToLiveSeconds="120" memoryStoreEvictionPolicy="LFU" /> <!--<cache name="baseCache" eternal="false" maxElementsInMemory="3000" overflowToDisk="true" diskPersistent="false" timeToIdleSeconds="0" timeToLiveSeconds="300" memoryStoreEvictionPolicy="LFU" />--> <!-- 配置自定义缓存 maxElementsInMemory:缓存中允许创建的最大对象数 eternal:缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。 timeToIdleSeconds:缓存数据的钝化时间,也就是在一个元素消亡之前, 两次访问时间的最大时间间隔值,这只能在元素不是永久驻留时有效, 如果该值是 0 就意味着元素可以停顿无穷长的时间。 timeToLiveSeconds:缓存数据的生存时间,也就是一个元素从构建到消亡的最大时间间隔值, 这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间。 overflowToDisk:内存不足时,是否启用磁盘缓存。 memoryStoreEvictionPolicy:缓存满了之后的淘汰算法。 --> </ehcache>

    缓存一定用于查询功能

    Processed: 0.017, SQL: 9