mybatis-cache包阅读

cache包主要功能

  • 一级缓存:一级本地缓存都是PerpetualCache类型,保存在BaseExecutor执行器,而执行器又在SqlSession中,所以一级缓存的生命周期与SqlSession相同,除非指定一级缓存范围为STATEMENT
  • 二级缓存:二级自定义缓存,实现了Cache接口的类都可以作为二级缓存,所以还可配置第三方缓存。二级缓存以namespace名称空间为其唯一标识,被保存在Configuration核心配置对象中,CachingExecutor执行器就是用来处理二级缓存的执行器。

cache包主要结构

cache包

cache包设计模式

  • 装饰设计模式:通过这些装饰器来实现所需功能:回收策略、日志记录、定时刷新等等。但是无论怎么装饰,经过多少层装饰,最后使用的还是基本的实现类PerpetualCache。
  • SoftCache:利用JDK的SoftReference软引用,借助垃圾回收器进行缓存对象的回收。
  • WeakCache:与SoftCache几乎相同,只是把软引用换成了弱引用。
  • 弱引用缓存代码:
/**
 * Weak Reference cache decorator.
 * Thanks to Dr. Heinz Kabutz for his guidance here.
 *
 * @author Clinton Begin
 */
public class WeakCache implements Cache {
  //为了阻止value被回收声明的队列
  private final Deque<Object> hardLinksToAvoidGarbageCollection;
  //ReferenceQueue可以完成,当一个obj被gc掉之后,其相应的包装类,即ref对象会被放入queue中。我们可以从queue中获取到相应的对象信息,同时进行额外的处理。比如数据清理等
  private final ReferenceQueue<Object> queueOfGarbageCollectedEntries;
  private final Cache delegate;
  private int numberOfHardLinks;
 
  public WeakCache(Cache delegate) {
    this.delegate = delegate;
    this.numberOfHardLinks = 256;
    this.hardLinksToAvoidGarbageCollection = new LinkedList<>();
    this.queueOfGarbageCollectedEntries = new ReferenceQueue<>();
  }
 
  @Override
  public String getId() {
    return delegate.getId();
  }
 
  @Override
  public int getSize() {
    removeGarbageCollectedItems();
    return delegate.getSize();
  }
 
  public void setSize(int size) {
    this.numberOfHardLinks = size;
  }
 
  @Override
  public void putObject(Object key, Object value) {
    removeGarbageCollectedItems();
    delegate.putObject(key, new WeakEntry(key, value, queueOfGarbageCollectedEntries));
  }
 
  @Override
  public Object getObject(Object key) {
    Object result = null;
    @SuppressWarnings("unchecked") // assumed delegate cache is totally managed by this cache
    WeakReference<Object> weakReference = (WeakReference<Object>) delegate.getObject(key);
    if (weakReference != null) {
      result = weakReference.get();
      if (result == null) {
        delegate.removeObject(key);
      } else {
        //用一个强引用队列指向value,这样阻止了被回收,阻止被回收的大小是numberOfHardLinks
        hardLinksToAvoidGarbageCollection.addFirst(result);
        if (hardLinksToAvoidGarbageCollection.size() > numberOfHardLinks) {
          hardLinksToAvoidGarbageCollection.removeLast();
        }
      }
    }
    return result;
  }
 
  @Override
  public Object removeObject(Object key) {
    removeGarbageCollectedItems();
    return delegate.removeObject(key);
  }
 
  @Override
  public void clear() {
    hardLinksToAvoidGarbageCollection.clear();
    removeGarbageCollectedItems();
    delegate.clear();
  }
 
  private void removeGarbageCollectedItems() {
    WeakEntry sv;
    //利用ReferenceQueue清理 无用的弱引用对象
    while ((sv = (WeakEntry) queueOfGarbageCollectedEntries.poll()) != null) {
      delegate.removeObject(sv.key);
    }
  }
 
  private static class WeakEntry extends WeakReference<Object> {
    private final Object key;
 
    private WeakEntry(Object key, Object value, ReferenceQueue<Object> garbageCollectionQueue) {
      super(value, garbageCollectionQueue);
      this.key = key;
    }
  }
  • 附上源码结构:
  • 好文链接:
    https://www.cnblogs.com/wuzhenzhao/p/11103043.html
    http://blog.csdn.net/kavendb/article/details/5935577
    cache包
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatis-Plus Generator 是Mybatis-Plus 提供的代码生成器,可以快速生成 Mybatis-Plus 所需的 Entity、Mapper、Service、Controller 等类文件。但是默认生成的代码只含 Entity 和 Mapper,如果需要生成其他文件如 DTO、VO、Convertor 等,则需要自定义模板来实现。 以下是使用 Mybatis-Plus Generator 自定义模板生成 DTO、VO、Convertor 的步骤: 1. 在 pom.xml 中添加依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>${mybatis-plus.version}</version> </dependency> ``` 2. 在 resources 目录下创建 mybatis-plus-generator 目录,并创建 generatorConfig.xml 配置文件,在其中配置需要生成的表名、文件路径、名等信息。示例配置如下: ```xml <generatorConfiguration> <dataSource type="com.zaxxer.hikari.HikariDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="jdbcUrl" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource> <packageInfo> <parent>com.example.demo</parent> <dto>dto</dto> <vo>vo</vo> <convertor>convertor</convertor> </packageInfo> <strategy> <tablePrefix>tbl_</tablePrefix> <include>tbl_user</include> </strategy> <template> <mapper>/templates/mapper.xml.vm</mapper> <entity>/templates/entity.java.vm</entity> <dto>/templates/dto.java.vm</dto> <vo>/templates/vo.java.vm</vo> <convertor>/templates/convertor.java.vm</convertor> </template> <globalConfig> <outputDir>src/main/java</outputDir> <fileOverride>true</fileOverride> <open>false</open> <enableCache>false</enableCache> <author>mybatis-plus-generator</author> <kotlin>false</kotlin> </globalConfig> </generatorConfiguration> ``` 其中: - dataSource:数据源配置 - packageInfo:名配置,dto、vo、convertor 分别对应生成的文件夹 - strategy:生成策略,tablePrefix 为表前缀,include 为需要生成的表名 - template:模板配置,mapper.xml、entity、dto、vo、convertor 分别对应生成的文件类型和模板文件路径 - globalConfig:全局配置,outputDir 为输出文件夹,fileOverride 为是否覆盖已有文件,author 为作者名 3. 在 templates 目录下创建 dto.java.vm、vo.java.vm、convertor.java.vm 模板文件,并根据需要进行自定义。例如生成 DTO 文件的模板如下: ```java package $packageInfo.dto; import lombok.Data; @Data public class $!{tableInfo.name}DTO { #foreach($field in $tableInfo.fields) private $field.propertyType $field.propertyName; #end } ``` 其中 $!{tableInfo.name} 表示表名,$field.propertyType 和 $field.propertyName 分别表示字段类型和字段名。 4. 在代码中使用 Mybatis-Plus Generator 生成代码。例如在 main 方法中调用 generate() 方法: ```java public static void main(String[] args) { AutoGenerator generator = new AutoGenerator(); generator.setTemplateEngine(new VelocityTemplateEngine()); generator.setTemplate(new TemplateConfig().setXml(null)); // 使用配置文件生成代码 generator.setConfig(new FileGeneratorConfigBuilder().getConfig()); generator.execute(); } ``` 其中 setTemplateEngine() 设置模板引擎为 Velocity,setTemplate() 设置生成的 XML 文件为空,setConfig() 从配置文件中获取配置。 5. 运行 main 方法,即可生成对应的 DTO、VO、Convertor 文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值