hibernate 是一个持久层的框架,经常访问物理数据库,为了降低应用程序访问物理数据库的频次, 从而提升性能,

hibernate缓存机制分为: 一类是session 级缓存,二是sessionFactory级缓存

session是一级缓存  内置的,不能卸载的 是事务范围的缓存

sessionFactory 是二级缓存 SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。第二级缓存是可选的,是一个可配置的插件,在默认情况下,SessionFactory不会启用这个插件。

二级缓存的配置:

(1)准备

把ehcache-1.2.3.jar加入到classpath中

在hibernate.cfg.xml中加入EHCache缓存插件的提供类

Category.hbm.xml
<?xml version="1.0"  encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC  "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd  ">
<hibernate-mapping>   
  <class  name="org.qiujy.domain.cachedemo.Category" table="categories">      
  < !—              配置缓存,必须紧跟在class元素后面             对缓存中的Category对象采用读写型的并发访问策略         -->      
  <cache  usage="read-write"/>             
  <id name="id"  type="java.lang.Long">       
     <column name="id" />           
< generator class="native" />       
</id>     
   <!-- 配置版本号,必须紧跟在id元素后面 -->       
<version name="version" column="version"  type="java.lang.Long" />          
     <property name="name"  type="java.lang.String">        
    <column name="name" length="32"  not-null="true"/>    
    </property>            
   < property name="description" type="java.lang.String">         
   < column name="description" length="255"/>     
   < /property>              
<set name="products" table="products"  cascade="all" inverse="true">           
<!-- Hibernate只会缓存对象的简单属性的值,        要缓存集合属性,必须在集合元素中也加入<cache>子元素        而Hibernate仅仅是把与当前持久对象关联的对象的OID存放到缓存中。 如果希望把整个关联的对象的所有数据都存入缓存, 则要在相应关联的对象的映射文件中配置<cache>元素            -->           
<cache usage="read-write"/>                    
   <key column="categoryId" not-null="true"/>         
   < one-to-many class="org.qiujy.domain.cachedemo.Product"/>    
    < /set>          
  < /class>
</hibernate-mapping>
Product.hbm.xml
<?xml version="1.0"  encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC  "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd  ">
<hibernate-mapping>    
<class  name="org.qiujy.domain.cachedemo.Product" table="products">           
    <cache usage="read-write"/>            
   <id  name="id" type="java.lang.Long">         
   <column name="id"  />           
<generator class="native" />    
    < /id>        <!-- 配置版本号,必须紧跟在id元素后面 -->      
  <version  name="version" column="version" type="java.lang.Long" />            
   < property name="name" type="java.lang.String">      
      <column  name="name" length="32" not-null="true"/>       
< /property>              
<property name="description"  type="java.lang.String">        
    <column name="description"  length="255"/>   
     </property>          
     <property  name="unitCost" type="java.lang.Double">        
    <column  name="unitCost" />     
   </property>          
     < property name="pubTime" type="java.util.Date">         
   <column  name="pubTime" not-null="true" />     
   </property>             
  <many-to-one name="category"                  column="categoryId"                 class="org.qiujy.domain.cachedemo.Category"                 cascade="save-update"                 not-null="true">      
   < /many-to-one>         
   < /class> </hibernate-mapping>
2)      编辑ehcache.xml文件:
 
<ehcache>     <diskStore  path="c://ehcache/"/>     <defaultCache          maxElementsInMemory="10000"         eternal="false"          timeToIdleSeconds="120"         timeToLiveSeconds="120"          overflowToDisk="true"           />             <!-- 设置Category类的缓存的数据过期策略 -->     <cache  name="org.qiujy.domain.cachedemo.Category"          maxElementsInMemory="100"         eternal="true"          timeToIdleSeconds="0"         timeToLiveSeconds="0"          overflowToDisk="false"         />              <!-- 设置Category类的products集合的缓存的数据过期策略 -->      <cache  name="org.qiujy.domain.cachedemo.Category.products"          maxElementsInMemory="500"         eternal="false"          timeToIdleSeconds="300"         timeToLiveSeconds="600"          overflowToDisk="true"         />             <cache  name="org.qiujy.domain.cachedemo.Product"          maxElementsInMemory="500"         eternal="false"          timeToIdleSeconds="300"         timeToLiveSeconds="600"          overflowToDisk="true"         />     </ehcache>
配置的元素说明: 元素或属性 描述 <diskStore> 设置缓存数据文件的存放目录 <defaultCache> 设置缓存的默认数据过期策略 <cache> 设定具体的命名缓存的数据过期策略 每个命名缓存代表一个缓存区域,每个缓存区域有各自的数据过期策略。命名缓存机制使得用户能够在每个类以及类的每个集合的粒度上设置数据过期策略。 cache元素的属性   name 设置缓存的名字,它的取值为类的全限定名或类的集合的名字 maxInMemory 设置基于内存的缓存中可存放的对象最大数目 eternal 设置对象是否为永久的,true表示永不过期,此时将忽略timeToIdleSeconds和timeToLiveSeconds属性; 默认值是false timeToIdleSeconds 设置对象空闲最长时间,超过这个时间,对象过期。当对象过期时,EHCache会把它从缓存中清除。 如果此值为0,表示对象可以无限期地处于空闲状态。 timeToLiveSeconds 设置对象生存最长时间,超过这个时间,对象过期。 如果此值为0,表示对象可以无限期地存在于缓存中。 overflowToDisk 设置基于内在的缓存中的对象数目达到上限后,是否把溢出的对象写到基于硬盘的缓存中

hibernate 及缓存机制的更多相关文章

  1. Hibernate笔记——缓存机制详细分析

    原文:http://www.cnblogs.com/xiaoluo501395377/p/3377604.html ========================================== ...

  2. java框架篇---hibernate之缓存机制

    一.why(为什么要用Hibernate缓存?) Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能. 缓存内的数据是对物理数 ...

  3. Hibernate学习---缓存机制

    前言:这些天学习效率比较慢,可能是手头的事情比较多,所以学习进度比较慢. 在之前的Hibernate学习中,我们无论是CURD,对单表查询还是检索优化,我们好像都离不开session,session我 ...

  4. Spring控制Hibernate的缓存机制ehcache

    首先在spring.xml中进入bean <prop key="hibernate.cache.use_second_level_cache">true</pro ...

  5. 【Hibernate 7】浅谈Hibernate的缓存机制

    一.Hibernate缓存机制简介 对于Hibernate本身来说,它的缓存主要包括三部分:session缓存(一级缓存).二级缓存.查询缓存. 1.1,session缓存 随着session的关闭而 ...

  6. hibernate 的缓存机制

    这是面试中经常问到的一个问题,楼主可以按照我的思路回答,准你回答得很完美,首先说下Hibernate缓存的作用(即为什么要用缓存机制),然后再具体说说Hibernate中缓存的分类情况,最后可以举个具 ...

  7. hibernate笔记--缓存机制之 二级缓存(sessionFactory)和查询缓存

    二级缓存(sessionFactory): Hibernate的二级缓存由SessionFactory对象管理,是应用级别的缓存.它可以缓存整个应用的持久化对象,所以又称为“SessionFactor ...

  8. Hibernate 所有缓存机制详解

    hibernate提供的一级缓存 hibernate是一个线程对应一个session,一个线程可以看成一个用户.也就是说session级缓存(一级缓存)只能给一个线程用,别的线程用不了,一级缓存就是和 ...

  9. Hibernate所有缓存机制详解

    hibernate提供的一级缓存 hibernate是一个线程对应一个session,一个线程可以看成一个用户.也就是说session级缓存(一级缓存)只能给一个线程用,别的线程用不了,一级缓存就是和 ...

随机推荐

  1. JavaWeb学习—Servlet

    1.什么是Servlet Servlet是一个继承HttpServlet类的Java类 Servlet必须部署在web服务器端,用来处理客户端的请求 2.Servlet运行过程 Web Client ...

  2. [置顶] 学习VB.NET编程最基本的三个问题

    1.什么是对象和属性,他们之间的联系是? 对象:将对象看做一个实物或者事物的一种概念.比如说窗体和控件都是对象. 属性:属性阐明了与对象相关的或是控制对象行为的信息,例如,对象的名字.颜色.尺寸或者位 ...

  3. Mac  任何选项没有了怎么办?

    1.如果需要恢复允许"任何来源"的选项,即关闭 Gatekeeper,请打开终端 2.然后使用 spctl 命令:  sudo spctl --master-disable

  4. Java学习笔记-File类的基本方法

    要渐渐养成写博客的习惯-----> 前段时间看Mars的java中的I/O流没怎么懂,发现I/O流好难啊.今天重新看一遍其他教学,还有书籍,做些笔记,记录下每天的学习生活. File类的一些方法 ...

  5. C#.net连接SQLite及遇到的问题

    1.Slite简介 SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需 ...

  6. 使用 MyEclipse远程调试 Java 应用程序

    远程调试,需要本程序和服务器上的程序源码是相同的,这我们服务器使用的是tomcat7.在本地通过MyEclipse 10来调试服务器上的代码,需要本地能访问到服务器,我的服务器是在linux下. 1. ...

  7. javascript中对象的不同创建方法

    javascript中的对象与一般的面向对象的程序设计语言(c++,Java等)不同,甚至很少有人说它是面向对象的程序设计语言,因为它没有类.javaScript只有对象,不是类的实例.javascr ...

  8. linux可执行文件目录的区别

    /bin./sbin./usr/bin./usr/sbin目录的区别 在linux下我们经常用到的四个应用程序的目录是/bin./sbin./usr/bin./usr/sbin .而四者存放的文件一般 ...

  9. Mysql中时间的操作笔记

    1.创建修改表时,为datetime字段设置当前时间为默认值 CREATE TABLE `NewTable` ( `id` int(11) NOT NULL AUTO_INCREMENT , `des ...

  10. python Memo

    list&tuple 运算 乘以constant >>> x = ((1,2),) >>> x*2 ((1, 2), (1, 2)) >>> ...