myabtis-spring-boot-starter一级缓存和二级缓存
1.一级缓存只存在于同一个sqlSession中,在spring中需要用注解@Transaction表明该方法执行完之后再commit从而保证一个方法中的多个查询在同一个sqlSession中,而不是每一次执行一个查询就commit一次然后关闭一个SqlSession。
2.二级缓存通过在xml文件中通过<cache/>标签开启,该标签有多个属性可以进行配置。
二级缓存以namespace为单位进行生效。只有通过同一个namespace进行了非select操作时才会刷新缓存。其他的任何手动修改数据表,在其他namespace进行修改数据操作都不会使缓存刷新。
3.解决二级缓存只在同一个namespace生效导致查询和修改操作写在不同的xml文件(即不同的namespace)出现缓存不会更新的问题。
通过<cache ref/>标签解决,改标签放在一个namespace中,另一个namespace中放置<cache />,这样就两个namespace共用同一份缓存了。
只需要保证双方各自拥有其中一个标签,对方拥有另一个标签即可。具体哪个namespace拥有哪个标签是无所谓的。
4.只需要最后执行sql的语句相同就会用到缓存,开启mybatis的debug级别的日志输出,可以看到缓存是否生效的日志打印。cache hit rate之类的。即使传入接口方法中的参数不一致,经过<if>等标签后最终执行的sql的一致则会使用缓存。
今天遇到的问题:一个xml写了对一张表的插入和修改,其他10个xml对这张表进行不同的条件查询。在插入的namespace中放在<cache />,另外10个xml的namespace中使用<cache ref/>。ref指向这个放置<cache/>标签的namespace即可。
无需再使用其他任何注解和配置,至此一级缓存和二级缓存的使用都解决了。