一、磁盘缓存:(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映射文件中添加
(1)映射语句文件中的所有select语句将会被缓存;
(2)映射语句文件中的所有insert、update、delete语句会刷新缓存;
(3)缓存会使用Least Recently Used(LRU最近最少使用)算法来回收;
(4)根据时间表(例如 no flush internal,没有刷新间隔),缓存不会以任何时间顺序来刷新;
(5)缓存会存储列表集合或对象(无论查询方法返回什么)的1024个引用;
(6)缓存会被视为是read/write(可读写)的,意味着对象检索不是共享的,而且可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。
所有这些属性都可以通过缓存元素的属性来修改。
2、举例
该配置创建了一个FIFO缓存,并每隔60秒刷新一次,存储结果对象或列表的512个引用,返回的对象是只读的,可用的回收策略默认是LRU:
LRU--最近最少使用:移除最长时间不被使用的对象;
FIFO--先进先出:按对象进入缓存的顺序来一处它们;
SOFT--软引用:移除基于垃圾回收器状态和软引用规则的对象;
WEAK--弱引用:更积极地移除基于垃圾回收器状态和弱引用规则的对象。
flushInterval(刷新间隔)可以被设置为任意的正整数,它们代表一个合理的毫秒形式的时间段。默认情况下是不设置的,即没有刷新间隔,缓存仅仅调用语句时刷新。
size(引用数目)可以被设置为任意正整数,默认是1024.
readOnly(只读)可以被设置为true或false,默认是false。只读的缓存会给所有调用者返回缓存对象的相同实例,因此这些对象不能被修改。可读写的缓存会返回缓存对象的拷贝(通过序列化),会慢一些,但是安全。