磁盘缓存、Hibernate缓存、Mybatis缓存

一、磁盘缓存:(disk cache)磁盘缓存分为读缓存和写缓存。

(1)读缓存指的是把从磁盘中读取的数据存储到内存空间中的方式。这样一来,当接下来需要读取同一数据时,就不用查询实际的磁盘,而是从磁盘缓存(内存)中把数据读出。使用磁盘缓存可以大大改善磁盘数据的访问速度。实现机制如下图:

(2) 写缓存是将要写入磁盘的数据先保存于系统为软件分配的内存空间(这个内存空间被称为“内存池”),当保存到内存池中的数据达到一个程度时,便将数据保存到硬盘中。这样可以减少实际的磁盘操作,减少写入所需的时间,也有效保护磁盘免于重复的读写操作而导致的损坏。

(3)磁盘缓存是为了减少CPU通过I/O读取磁盘的次数,提升I/O的效率,用一块内存来储存存取较频繁的磁盘内容,因为内存的存取是电子动作,而磁盘的存取是I/O动作。

二、Hibernate缓存:hibernate缓存包含一级缓存和二级缓存两大类。

(1)Hibernate一级缓存又称为“Session 的缓存”。Session缓存是内置缓存,是事务范围的缓存(Session对象的生命周期通常对应一个数据库事务或者一个应用事务)。每个Session都有自己独立的缓存,其中存放了被当前工作单元加载的对象,且只能被当前工作单元访问。一级缓存中,持久化类的每个实例都有唯一的OID。

(2)Hibernate二级缓存又称为“SessionFactory 的缓存”。SessionFactory缓存分为内置缓存和外置缓存。

SessionFactory外置缓存是可配置的缓存插件,其中的数据可以被多个Session共享访问。默认情况下,SessionFactory不会启用这个插件。外置缓存中的数据是数据库数据的拷贝,外置缓存的介质可以是内存或者硬盘。外置缓存也被称为Hibernate的第二级缓存。

SessionFactory的内置缓存和Session的缓存在实现方式上比较相似,前者是SessionFactory对象的一些集合属性包含的数据,后者是Session的一些集合属性包含的数据。内置缓存中存放了映射元数据和预定义的sql语句。映射元数据是映射文件中数据的拷贝,而预定义sql语句是在Hibernate初始化阶段根据映射元数据推导出来的,因此SessionFactory的内置缓存是只读的,应用程序不能修改缓存中的映射元数据和预定义sql语句,因此SessionFactory不需要进行内置缓存与映射文件的同步。

由于Session Factory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题。因此需要适当的并发策略,该策略为被缓存的数据提供了事务隔离级别。

(3)Hibernate缓存的应用:当Hibernate根据ID访问数据对象的时候,首先从Session以及缓存中查,查不到,如果配置了二级缓存,再从二级缓存中查,如果都查不到,最后查数据库,把结果按照ID放入到缓存,删除、更新、增加数据的时候,同步更新缓存。

三、Hibernate的缓存机制:

缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存中读写数据,在特定的时刻或特定事件发生时会同步缓存和物理数据源的数据。

缓存的介质一般是内存,但如果缓存中存放的数据量非常大,也会用硬盘作为缓存介质。缓存的实现不仅仅要考虑存储的介质,还要考虑到管理缓存的并发访问和缓存数据的生命周期。

Hibernate的这两级缓存都位于持久化层,存放的都是数据库数据的拷贝,对于二者的更深层次的了解,可以参考以下资料:http://blog.csdn.net/u014586894/article/details/51630562

http://www.cnblogs.com/wean/archive/2012/05/16/2502724.html

四、Mybatis缓存:

1、Myatis默认情况下是没有开启缓存的,可以通过在sql映射文件中添加<cache/>开启缓存。该语句的效果如下:

(1)映射语句文件中的所有select语句将会被缓存;

(2)映射语句文件中的所有insert、update、delete语句会刷新缓存;

(3)缓存会使用Least Recently Used(LRU最近最少使用)算法来回收;

(4)根据时间表(例如 no flush internal,没有刷新间隔),缓存不会以任何时间顺序来刷新;

(5)缓存会存储列表集合或对象(无论查询方法返回什么)的1024个引用;

(6)缓存会被视为是read/write(可读写)的,意味着对象检索不是共享的,而且可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。

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

2、举例

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

该配置创建了一个FIFO缓存,并每隔60秒刷新一次,存储结果对象或列表的512个引用,返回的对象是只读的,可用的回收策略默认是LRU:

LRU--最近最少使用:移除最长时间不被使用的对象;

FIFO--先进先出:按对象进入缓存的顺序来一处它们;

SOFT--软引用:移除基于垃圾回收器状态和软引用规则的对象;

WEAK--弱引用:更积极地移除基于垃圾回收器状态和弱引用规则的对象。

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

size(引用数目)可以被设置为任意正整数,默认是1024.

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

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值