• Cache元素


    一、介绍

    MyBatis 包含一个强大的、可配置、可定制的查询缓存机制。MyBatis3 的缓存实现有了许多改进,使它更强大更容易配置。默认的情况,缓存是没有开启的,除了会话缓存以外,会话缓存可以提高性能,且能解决循环依赖。开启二级缓存,您只需要在 SQL 映射文件中加入简单的一行:

    <cache/>

    当然,配置文件中最好加上下面一行

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

    这句简单的语句作用如下:

    • 所有映射文件里的 select 语句的结果都会被缓存。
    • 所有映射文件里的 insert、update 和 delete 语句执行都会清空缓存。
    • 缓存使用最近最少使用算法(LRU)来回收。
    • 缓存不会被设定的时间所清空。
    • 每个缓存可以存储 1024 个列表或对象的引用(不管查询方法返回的是什么)。
    • 缓存将作为“读/写”缓存,意味着检索的对象不是共享的且可以被调用者安全地修改,而不会被其它调用者或者线程干扰。

    所有这些特性都可以通过 cache 元素进行修改。例如:

    <cache
        eviction="FIFO"
        flushInterval="60000"
        size="512"
        readOnly="true"/>

    这种高级的配置创建一个每 60 秒刷新一次的 FIFO 缓存,存储 512 个结果对象或列表的引用,并且返回的对象是只读的。因此在不用的线程里的调用者修改它们可能会引用冲突。

    • flushInterval:设置任何正整数,代表一个以毫秒为单位的合理时间。默认是没有设置,因此没有刷新间隔时间被使用,在语句每次调用时才进行刷新。
    • Size:属性可以设置为一个正整数,您需要留意您要缓存对象的大小和环境中可用的内存空间。默认是1024。
    • readOnly:属性可以被设置为 true 或 false。只读缓存将对所有调用者返回同一个实例。因此这些对象都不能被修改,这可以极大的提高性能。可写的缓存将通过序列化来返回一个缓存对象的拷贝。这会比较慢,但是比较安全。所以默认值是 false。

    二、可用的回收算法

    • LRU:最近最少使用:移出最近最长时间内都没有被使用的对象。
    • FIFO:先进先出:移除最先进入缓存的对象。
    • SOFT:软引用:基于垃圾回收机制和软引用规则来移除对象(空间内存不足时才进行回收)。
    • WEAK:弱引用:基于垃圾回收机制和弱引用规则(垃圾回收器扫描到时即进行回收)。

    默认使用LRU

    三、使用自定义缓存

    除了上面已经定义好的缓存方式,您能够通过您自己的缓存实现来完全重写缓存行为,或者通过创建第三方缓存解决方案的适配器。

    <cache type="com.domain.something.MyCustomCache"/>

    这个例子演示了如果自定义缓存实现。由 type 指定的类必须实现 org.mybatis.cache.Cache 接口。这个接口是 MyBatis 框架比较复杂的接口之一,先给个示例:

    public interface Cache{
        String getId();
        int getSize();
        void putObject(Object key,Object value);
        ObjectgetObject(Object key);
        boolean hasKey(Object key);
        Object removeObject(Object key);
        void clear();
        ReadWriteLock getReadWriteLock();
    }

    要配置您的缓存,简单地添加一个公共的 JavaBeans 属性到您的缓存实现中,然后通过 cache 元素设置属性进行传递,下面示例,将在您的缓存实现上调用一个 setCacheFile(String file) 方法。

    <cache type="com.domain.something.MyCustomCache">
        <property name="cacheFile" value="/tmp/my-custom-cache.tmp"/>
    </cache>

    您可以使用所有简单的 JavaBeans 属性,MyBatis 会自动进行转换。

    需要牢记的是一个缓存配置和缓存实例都绑定到一个 SQL Map 文件命名空间。因此,所有的这个相同命名空间的语句也都和这个缓存绑定。语句可以修改如何与这个缓存相匹配,或者使用两个简单的属性来完全排除它们自己。默认情况下,语句像下面这样来配置:

    <select...flushCache="false" useCache="true"/>
    <insert...flushCache="true"/>
    <update...flushCache="true"/>
    <delete...flushCache="true"/>

    因为有默认值,所以您不需要使用这种方式明确地配置这些语句。如果您想改变默认的动作,只需要设置 flushCache 和 useCache 属性即可。举个例子来说,在许多的场合下您可能排除缓存中某些特定的 select 语句。或者您想用 select 语句清空缓存。同样的,您也可能有一些 update 语句在执行的时候不需要清空缓存。

    四、cache-ref元素

    回想上一节,我们仅仅只是讨论在某一个命名空间里使用或者刷新缓存。但有可能您想要在不同的命名空间里共享同一个缓存配置或者实例。在这种情况下,您就可以使用 cache-ref 元素来引用另外一个缓存。

    <cache-ref namespace="com.someone.application.data.SomeMapper"/>
  • 相关阅读:
    pytorch的常用接口、操作、注意事项
    pytorch 中conv1d操作
    NLP基本知识点和模型
    深度学习基础理论知识
    对交叉验证的理解
    阅读深度学习论文的一些技巧
    机器学习和深度学习入门总结
    架构思考-业务快速增长时的容量问题
    系统梳理一下锁
    稳定性五件套-限流的原理和实现
  • 原文地址:https://www.cnblogs.com/jwen1994/p/10923854.html
Copyright © 2020-2023  润新知