mybatis提供了查询缓存,以减少数据压力并提高数据库性能。 mybaits提供l1缓存和l2缓存。
一级高速缓存一级高速缓存是sqlSession级高速缓存。 在处理数据库时,必须生成sqlSession对象。 对象具有存储缓存数据的“内存区域”数据结构“HashMap”。 不同sqlSession之间的缓存数据区域(HashMap )互不影响。
一级缓存的范围是同一SqlSession,在同一SqlSession中执行两次同一sql语句。 第一次执行完成后,数据库中查询的数据写入缓存(内存),第二次从缓存检索数据后,不再从数据库查询检索数据,从而提高查询效率。 sqlSession结束后,sqlSession的一级缓存也不再存在。 Mybatis默认情况下打开l1缓存。
l2高速缓存l2高速缓存是映射器级别的高速缓存,多个sqlSession使用同一映射器的sql语句,而通过操作数据库获得的数据中存在l2高速缓存空间。 多个sqlSession可以共享l2缓存。 l2缓存在sqlSession之间共享。
l2缓存由多个sqlSession共享,范围为mapper的同一namespace,不同的sqlSession在同一namespace下执行两次sql语句,并将参数传递给sql,最终执行相同的sql语句, 第一次执行完成后,数据库中查询的数据将写入缓存(内存),第二次,Mybatis默认情况下未打开l2缓存。 必须将l2缓存设置为使用setting全局参数打开。
Spring缓存如果Spring与MyBatis集成,则MyBatis的l1缓存在事务不存在时被禁用。
如果事务没有打开,则此时不会启用一级高速缓存,因为对于每个查询,spring都会关闭旧的sqlSession并创建新的sqlSession。
打开事务时,spring使用threadLocal检索当前资源并将其绑定到同一sqlSession。 因此,此时一级缓存是有效的。
默认情况下,SpringBoot全局启用l2缓存。 要使用l2缓存,还必须在映射器中注明。
注释版使用@CacheNamespace注释(在特定命名空间(如类)中设置缓存并与xmlcache相对应)在mapper中使用l2缓存。
33558 www.Sina.com/@ cache namespace注释主要用于mybatis缓存,与cache属性相同。 缺省情况下,MyBatis 3不打开l2缓存。 要打开l2缓存,必须在SQL映射文件(mapper.xml )中添加:行
映射器名称eviction=' cn.my batis.my demo.mapper.student mapper ' cache eviction=' FIFO ' flush interval=' 60000 ' readon
setting name=' cache enabled ' value=' true '/cache namespace是一个注释,其源代码如下:
@ documented @ retention (retention policy.runtime ) target ) elementtype.type ) public @ interfacecachenamespace { class pppe Class? extends org.Apache.ibatis.cache.cache eviction () default LruCache.class; long flush间隔() default 0; intsize(default1024; boolean readWrite ()默认真; boolean blocking ()默认假; Property[] properties () default {} ); }如果要将配置文件与接口注释一起使用,则必须在xml配置文件中设置cache属性,然后在界面中将注释更改为@CacheNamespaceRef。
@CacheNamespace
Java没有指针,但Java有引用。 CacheNamespaceRef是引用。 那是谁的引用? 请参阅源代码注释:
anamespacetypetoreferenceacache (thenamespacenamebecomeafqcnofspecifiedtype ) )。
fqcn=全品质类别名称
上面的意思我想说明。 CacheNamespaceRef用作CacheNamespace的快捷键。 这是CacheNamespace的引用。
@ documented @ retention (retention policy.runtime ) target ) elementtype.type ) public @ interfacecachenamespaceref {/ion anamespacetypetoreferenceacache (thenamespacenamebecomeafqcnofspecifiedtype ) */Class? value (默认void.class;/* * anamespacenametoreferenceacache * @ since3.4.2*/string name () default ' ); }查看注释源,value是当前类,name是要使用的Mapper接口的完全限定名称,可以使用以下三种书写方式:
CacheNamespaceRef角色:
我们知道,MyBatis分为l1缓存和l2缓存。 一级缓存处于会话级,二级缓存处于APP应用程序级。 但是,MyBatis并不是简单地对整个APP只拥有一个Cache缓存对象,而是更精细地划分缓存。 也就是说,是映射器级别。 也就是说,每个映射器可以有一个Cache对象,如下所示:
)1)为每个映射器分配Cache缓存对象(使用Cache节点配置或@CacheNamespace注释);
(2)多个映射器共享一个Cache缓存对象(使用cache-ref节点设置或本文提到的@CacheNamespaceRef注释);
Mybatis缓存映像: