关闭

浅谈MyBatis中的缓存

标签: mybatis缓存
197人阅读 评论(0) 收藏 举报
分类:

本文主要是说的MyBatis中的缓存,是从官方文档中择出来的 , 主要便于本人的后期查阅。其他详细说明请访问mybatis官方文档

缓存

MyBatis中包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。MyBatis 3 中的缓存实现的很多改进都已经实现了,使得它更加强大而且易于配置。默认情况下是没有开启缓存的,除了局部的 session 缓存,可以增强变现而且处理循环 依赖也是必须的。要开启二级缓存,你只需要在你的 SQL 映射文件中添加一行:

<cache/>

是不是感觉很so easy ! 这个简单的配置达到了以下的效果 :

  • 映射语句文件中的所有的select语句将都会被缓存.
  • 映射语句文件中的所有 insert , update , delete 都将会刷新缓存.
  • 缓存会使用 Least Recently Used (LRU,最近最少使用的)算法来收回.
  • 根据时间表(比如 no Flush Interval,没有刷新间隔), 缓存不会以任何时间顺序 来刷新.
  • 缓存会存储列表集合或对象(无法查询方法返回什么)的1024个引用.
  • 缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是共享的,而 且可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改.

所有的这些属性都可以通过缓存的元素的属性来修改。比如:

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

这个更高级的配置创建了一个 FIFO 缓存,并每隔 60 秒刷新,存数结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此在不同线程中的调用者之间修改它们会 导致冲突。

eviction中可用的收回策略有:

  • LRU – 最近最少使用的:移除最长时间不被使用的对象。
  • FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
  • SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
  • WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。

默认是LRU.

flushInterval(刷新间隔)可以被设置为任意的正整数,而且它们代表一个合理的毫秒 形式的时间段。默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。

size(引用数目)可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的 可用内存资源数目。默认值是 1024。

readOnly(只读)属性可以被设置为 true 或 false。只读的缓存会给所有调用者返回缓 存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存 会返回缓存对象的拷贝(通过序列化) 。这会慢一些,但是安全,因此默认是 false。

使用自定义缓存

除了这些自定义缓存的方式, 你也可以通过实现你自己的缓存或为其他第三方缓存方案 创建适配器来完全覆盖缓存行为。

<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);
  Object getObject(Object key);
  boolean hasKey(Object key);
  Object removeObject(Object key);
  void clear();
}

要配置你的缓存, 简单和公有的 JavaBeans 属性来配置你的缓存实现, 而且是通过 cache 元素来传递属性, 比如, 下面代码会在你的缓存实现中调用一个称为 “setCacheFile(String file)” 的方法:

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

你可以使用所有简单类型作为 JavaBeans 的属性,MyBatis 会进行转换。,你可以指定一个占位符(例如$ { cache.file })来代替值定义在配置属性。

3.4.2以来,MyBatis一直支持调用一个初始化方法后的所有属性。如果你想使用此功能,请实现了org.apache.ibatis.builder。InitializingObject界面自定义缓存类。

public interface InitializingObject {
  void initialize() throws Exception;
}

记得缓存配置和缓存实例是绑定在 SQL 映射文件的命名空间是很重要的。因此,所有 在相同命名空间的语句正如绑定的缓存一样。 语句可以修改和缓存交互的方式, 或在语句的 语句的基础上使用两种简单的属性来完全排除它们。默认情况下,语句可以这样来配置:

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

因为那些是默认的,你明显不能明确地以这种方式来配置一条语句。相反,如果你想改 变默认的行为,只能设置 flushCache 和 useCache 属性。比如,在一些情况下你也许想排除 从缓存中查询特定语句结果,或者你也许想要一个查询语句来刷新缓存。相似地,你也许有 一些更新语句依靠执行而不需要刷新缓存。

参照缓存

回想一下上一节内容, 这个特殊命名空间的唯一缓存会被使用或者刷新相同命名空间内 的语句。也许将来的某个时候,你会想在命名空间中共享相同的缓存配置和实例。在这样的 情况下你可以使用 cache-ref 元素来引用另外一个缓存。

<cache-ref namespace="com.someone.application.data.SomeMapper"/>

(转载注明出处:http://blog.csdn.net/chen940075318

1
0
查看评论

用例子介绍mybatis的缓存机制

在实际的项目开发中,通常对数据库的查询性能要求很高,而mybatis提供了查询缓存来缓存数据,从而达到提高查询性能的要求。 mybatis的查询缓存分为一级缓存和二级缓存,一级缓存是SqlSession级别的缓存,二级缓存时mapper级别的缓存,二级缓存是多个SqlSession共享的。mybat...
  • zouxucong
  • zouxucong
  • 2017-04-01 18:51
  • 1957

MyBatis缓存配置

Mybatis二级缓存配置在很多场合中需要用到数据库缓存。 此文档简单描述如何在spring + mybatis场合下配置缓存。1. Mybatis缓存简介Mybatis提供功能强大的缓存机制。缓存共可以分为两类:一级缓存和二级缓存。一级缓存是SqlSession级别的,二级缓存为整个应用级别,即一...
  • bingduanlbd
  • bingduanlbd
  • 2016-06-29 17:47
  • 1267

Mybatis缓存机制深入解析

缓存概述  正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持;一级缓存基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Ses...
  • samjustin1
  • samjustin1
  • 2016-08-16 15:08
  • 3775

mybatis关闭缓存

这次项目用的是mybatis,进行到现在遇到一个问题,查询语句会有缓存,就是数据更改后,在一定时间读到的依然是旧数据,mybatis内部本来在插入,删除,修改等方法执行后会清楚缓存,但是由于后台使php的,而java这边仅仅是查询,所以当php更新后java不能及时读取到最新的数据,怎么办?  ...
  • Augus3344
  • Augus3344
  • 2016-04-30 18:17
  • 2129

浅谈MyBatis 之 入门(一)

MyBatis什么是mybatis呢?它是一个优秀的对象关系映射持久层框架。 MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注...
  • mybook201314
  • mybook201314
  • 2017-01-20 11:04
  • 559

《深入理解mybatis原理》 MyBatis缓存机制的设计与实现

本文主要讲解MyBatis非常棒的缓存机制的设计原理,给读者们介绍一下MyBatis的缓存机制的轮廓,然后会分别针对缓存机制中的方方面面展开讨论。
  • u010349169
  • u010349169
  • 2014-11-23 13:57
  • 37863

Mybatis的缓存

1、关于缓存的介绍 Mybatis一级缓存的作用域是同一个SqlSession,在同一个sqlSession中两次执行相同的sql语句,第一次执行完毕会将数据库中查询到的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。当一个sqlSession结...
  • zbw18297786698
  • zbw18297786698
  • 2016-12-19 19:17
  • 729

MyBatis的缓存配置(Cache)

一、MyBatis的Cache配置 1、全局开关:默认是true,如果它配成false,其余各个Mapper XML文件配成支持cache也没用。 2、各个Mapper XML文件,默认是不采用cache。在配置文件加一行就可以支持cache:
  • woshisap
  • woshisap
  • 2011-09-27 12:57
  • 23961

Mybatis实现事务的方式和缓存

1.事务 事务是单个逻辑工作单元执行的一系列操作。要么全部执行,要么全部不执行。 事务结束的两种方式:1.事务所有操作步骤全部成功执行,事务提交             &#...
  • m0_37329355
  • m0_37329355
  • 2017-08-10 10:41
  • 239

Mybatis(三)、mybatis执行示例和mybatis事务以及缓存跟二级缓存简单了解

一、Mybatis在控制台程序中的演示示例 1、创建sqlSession数据库语句执行对象 Reader reader=Resources.getResourceAsReader("resourse.xml"); SqlSessionFactory sqlSessionF...
  • gezi2015129
  • gezi2015129
  • 2017-03-13 11:05
  • 405
    个人资料
    • 访问:1931次
    • 积分:76
    • 等级:
    • 排名:千里之外
    • 原创:5篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类