zoukankan      html  css  js  c++  java
  • mybatis 缓存(cache)的使用

    许多应用程序,为了提高性能而增加缓存, 特别是从数据库中获取的数据. 在默认情况下,mybatis 的一级缓存是默认开启的。类似于hibernate, 所谓一级缓存,也就是基于同一个sqlsession 的查询语句,即 session 级别的缓存,非全局缓存,或者非二级缓存.

    如果要实现 mybatis 的二级缓存,一般来说有如下两种方式:
    1. 采用 mybatis 内置的 cache 机制。
    2. 采用三方 cache 框架, 比如ehcache, oscache 等等.

    采用 mybatis 内置的 cache 机制。
    在 sql 语句映射文件中加入 <cache /> 语句 , 并且相应的 model 类要实现 java Serializable 接口,因为缓存说白了就是序列化与反序列化的过程,所以需要实现这个接口. 单纯的 <cache /> 表示如下意思:

    1.所有在映射文件里的 select 语句都将被缓存。
    2.所有在映射文件里 insert,update 和 delete 语句会清空缓存。
    3.缓存使用“最近很少使用”算法来回收
    4.缓存不会被设定的时间所清空。
    5.每个缓存可以存储 1024 个列表或对象的引用(不管查询出来的结果是什么) 。
    6.缓存将作为“读/写”缓存,意味着获取的对象不是共享的且对调用者是安全的。不会有其它的调用者或线程潜在修改。
    缓存元素的所有特性都可以通过属性来修改。比如:

    程序代码 程序代码

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



    采用 ehcache 来实现 mybatis  的二级缓存 

    首先需要在 mybatis 的官网上下载相关jar 包:https://code.google.com/p/mybatis/ 写文档的时候下载的是:mybatis-ehcache-1.0.2.zip ,里面包括了

    程序代码 程序代码

    mybatis-ehcache-1.0.2.jar
    ehcache-core-2.6.5.jar
    slf4j-api-1.6.1.jar



    当然,采用ehcache 就必须在 classpath 下 加入ehcache 的配置文件 ehcache.xml:

    程序代码 程序代码

    <cache name="default"
        maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="3600"
        timeToLiveSeconds="10"
        overflowToDisk="true"
        diskPersistent="true"
        diskExpiryThreadIntervalSeconds="120"
        maxElementsOnDisk="10000"
    />



    那么在 sql 映射文件中要如何配置呢,参考如下:

    程序代码 程序代码

    <cache type="org.mybatis.caches.ehcache.LoggingEhcache" > 
            <property name="timeToIdleSeconds" value="3600"/><!--1 hour-->
            <property name="timeToLiveSeconds" value="3600"/><!--1 hour-->
            <property name="maxEntriesLocalHeap" value="1000"/>
            <property name="maxEntriesLocalDisk" value="10000000"/>
            <property name="memoryStoreEvictionPolicy" value="LRU"/>
        </cache>



    总结:无论是采用mybatis 自身的cache  还是三方的cache , 这样的配置,就是对 所有的select 语句都全局缓存,但事实上,并不总是这样,比如,我在这系列教程中第七章中http://www.yihaomen.com/article/java/326.htm,自己写的分页算法,就不能用这种情况。需要禁止掉cache ,所以需要如下方法:

    程序代码 程序代码

    <select id="selectArticleListPage" resultMap="resultUserArticleList" useCache="false">
    .......



    注意到 useCache="false" 了吗? 这可以避免使用缓存。

  • 相关阅读:
    Redis篇
    MySql篇
    Tomcat篇
    JDK篇
    冒泡排序(算法源码)
    堆排序(源码)
    快速排序(递归及非递归算法源码)
    MongoDB 复制
    MongoDB appendix
    服务器端脚本
  • 原文地址:https://www.cnblogs.com/jtlgb/p/6394646.html
Copyright © 2011-2022 走看看