- @CacheNamespace 注解主要用于 mybatis 二级缓存,等同于<cache>属性。默认情况下,MyBatis 没有开启二级缓存
- @CacheNamespace 注解有以下属性:
属性 |
描述 |
implemetation |
设置缓存的默认实现接口,默认是PerpetualCache.class |
eviction |
默认溢出淘汰策略,默认LruCache.class |
flushInterval |
缓存有效期,默认0 即用不失效 |
size |
缓存容量 |
readWrite |
支持缓存读写策略 当该属性被设置为true时,缓存命名空间将支持读写操作,缓存数据允许被更新;当该属性被设置为false时,缓存命名空间将只支持读操作,缓存数据无法被更新 |
blocking |
设置是否阻塞。
当该属性被设置为 true 时,如果多个线程同时请求同一个缓存项,只有一个线程能够获取到锁并执行查询操作,其他线程会等待该线程查询完毕后再从缓存中获取数据。可以避免缓存穿透和雪崩问题。
当该属性被设置为 false 时,则不会启用阻塞模式,多个线程同时请求同一个缓存项时,每个线程都会去执行查询操作,并将结果放入缓存中。这种情况下可能会出现缓存穿透和雪崩问题。 |
properties |
用于配置缓存的属性,可以通过该属性设置缓存的一些参数,例如缓存的大小、过期时间等。具体来说,properties 属性是一个数组,每个元素都是一个 Property 对象,用于表示一个缓存属性 |
示例
@CacheNamespace(implementation = MybatisRedisCache.class)
public interface UserMapper(){
…
}
示例
@CacheNamespace(
implementation = PerpetualCache.class,
flushInterval = 60000,
size = 1024,
readWrite = true,
blocking = false,
properties = {
@Property(name = "sizeLimit", value = "1000"),
@Property(name = "timeToIdleSeconds", value = "600"),
@Property(name = "timeToLiveSeconds", value = "1800")
}
)
public interface UserMapper(){
…
}
注
- 当启用二级缓存的阻塞模式时,如果某个线程在获取锁后执行查询操作的时间过长,可能会导致其他线程等待时间过长或者超时。因此,在使用阻塞模式时需要根据实际情况合理设置等待时间和超时时间。