Hibernate缓存

简介: Hibernate缓存在工作面试的时候很可能会遇到的问题。 缓存其实就是一块内存空间,充当数据库的内存中的一个临时的容器。 一:hibernate缓存是怎样的?    Hibernate缓存提供了两种缓存:一级缓存和二级缓存。

Hibernate缓存在工作面试的时候很可能会遇到的问题。

缓存其实就是一块内存空间,充当数据库的内存中的一个临时的容器。

一:hibernate缓存是怎样的?

   Hibernate缓存提供了两种缓存:一级缓存和二级缓存。

1 一级缓存又称事务级缓存,Session的缓存。

    在Hibernate中一级缓存存是基于Session的生命周期实现的,每一个Session会在内部维护一个数据缓存,她随着Session的创建而创建,销毁而销毁。

    一级缓存是必须的,在同一个一级缓存中,每一个持久化类的对象都是唯一的(都有唯一的OID)。   

2 二级缓存又称应用级缓存 SessionFactory的缓存 。

   在Hibernate中二级级缓存是由SessionFactory实现,所有用一个SessionFactory创建的Session对象共享此缓存。

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

  第二级缓存是可选的,是一个可配置的插件,默认下SessionFactory不会启用这个插件。

什么样的数据适合存放到第二级缓存中?   
  1) 很少被修改的数据   
  2) 不是很重要的数据,允许出现偶尔并发的数据   
  3) 不会被并发访问的数据   
  4) 常量数据   
不适合存放到第二级缓存的数据?   
  1) 经常被修改的数据   
  2) 绝对不允许出现并发访问的数据,  
  3) 与其他应用共享的数据。

 

二:为什么我们要使用Hibernate缓存?

            Hibernate就是对JDBC进行的封装 带来的就是数据访问效率的降低,和性能的下降 对于Hibernate这类ORM而言,缓存显的尤为重要,它是持久层性能提升的关键。

    1 Hibernate是一个持久层框架,经常访问物理数据库。

  2 为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能。

  3 缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。

三:怎样使用hibernate缓存?

 二级缓存:

1 开始缓存:

为了开启二级缓存,需要在hibernate.cfg.xml文件中配置如下属性:

1 <!-- 开启二级缓存 -->
2         <property name="cache.use_second_level_cache">true</property>

一旦开启了二级缓存,并设置了对某个持久化实体类启动缓存,SessionFactory就会缓存应用访问过的该实体类的每个对象,除非缓存的数据超出缓存空间。

2 在实际应用中,一般不需要开发者自己实现缓存,直接使用第3方提供的开源缓存实现即可。因此在hibernate.cfg.xml文件中设置开启缓存后,还需要设置使用哪种缓存实现类。配置如下:

1 <!-- 设置二级缓存的实现类 -->
2         <property name="cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>

 

 

需要注意的是:

3 实际上在项目中使用EHCache缓存实现,仅仅复制lib\optional\下对应缓存的JAR包还不够,应用EHCache还需要依赖于commons-logging.jar,backport-util-concurrent.jar两个工具包。

 

4 将缓存实现所需要的配置文件添加到系统的类加载路径中,对于EHCache缓存,它还需要一个ehcache.xml配置文件:

 

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <ehcache>
 3     <diskStore path="D:/path"/>       <!-- 启用磁盘缓存的位置-->
 4     <defaultCache
 5         maxElementsInMemory="10000"
 6         eternal="false"
 7         timeToIdleSeconds="120"
 8         timeToLiveSeconds="120"
 9         overflowToDisk="true"
10         />
11         <!-- maxElementsInMemory 设置缓存中最多可放多少个对象 -->
12         <!-- eternal 设置缓存是否永久有效 -->
13         <!-- timeToIdleSeconds 设置缓存的对象多少秒没有被使用就会清理掉 -->
14         <!-- timeToLiveSeconds 设置缓存的对象在销毁之前可以缓存多少秒 -->
15         <!-- overflowToDisk 设置当内存中缓存的记录达到maxElementsInMemory 时是否被持久化到硬盘中,保存路径由<diskStore../>元素指定 -->
16 </ehcache>

 

 

 

5 在实体的缓存策略放在不同的映射文件中分别管理:

 

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC 
 3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 5     
 6     <hibernate-mapping>
 7     
 8     <class name="com.cy.beans.Author" table="t_author" catalog="j2ee">   <!-- catalog数据库 -->
 9       <!-- 设置缓存策略 -->
10         <cache usage="read-only"/>  <!--   这里-->
11      
12               <id name="id" type="java.lang.Long"><!-- 此行的ID,为对象的属性ID -->
13                   <column name="id"></column><!-- 此行的ID,为表字段ID -->
14                   <generator class="increment"></generator><!-- 给id指定生成策略 -->
15               </id>
16     
17               <property name="authorName" type="java.lang.String">
18                  <column name="authorName"></column>
19               </property>
20               
21          <!--lazy :lazy是延时的意思,如果lazy=true,那么就是说数据库中关联子表的信息在hibernate容器启动的时候不会加载,而是在你真正的访问到字表非标识字段的时候,才会去加载。
22                                                 反之,如果lazy=false的话,就是说,子表的信息会同主表信息同时加载  
23                    Hibernate3.x,lazy默认是true;
24                    -->
25          <!-- inverse:hibernate双向关系中的基本概念。inverse的真正作用就是指定由哪一方来维护之间的关联关系。当一方中指定了“inverse=false”(默认),那么那一方就有责任负责之间的关联关系 -->
26         
27     <set name="books" table="t_book" cascade="all" inverse="true" lazy="false"><!-- set映射节点 -->
28              <key column="fk_author_id"></key><!-- 外键 -->
29              <one-to-many class="com.cy.beans.Book"/><!--one-to-mang节点  -->
30     </set>
31     </class>
32      
33     </hibernate-mapping>

缓存同步策略决定了数据对象在缓存中的存取规则.Hibernate中提供了4种不同的缓存同步策略

相关文章
|
缓存 开发框架 NoSQL
7.4缓存
缓存是一个用来保存数据的区域,从缓存中读取数据要比从数据源读取数据的速度快很多。如果可以从缓存中获取要获取的数据则称之为“缓存命中”,多次请求命中的请求占全部请求的百分比叫做“命中率”,如果数据源中的数据保存到了缓存后,发生了变化则称之为“缓存数据不一致”
|
缓存 NoSQL 算法
高并发系统三大利器之缓存
高并发系统三大利器之缓存
274 0
高并发系统三大利器之缓存
|
7天前
|
NoSQL Cloud Native Redis
Redis核心开发者的新征程:阿里云与Valkey社区的技术融合与创新
阿里云瑶池数据库团队后续将持续参与Valkey社区,如过往在Redis社区一样耕耘,为开源社区作出持续贡献。
Redis核心开发者的新征程:阿里云与Valkey社区的技术融合与创新
|
7天前
|
关系型数据库 分布式数据库 数据库
PolarDB闪电助攻,《香肠派对》百亿好友关系实现毫秒级查询
PolarDB分布式版助力《香肠派对》实现百亿好友关系20万QPS的毫秒级查询。
PolarDB闪电助攻,《香肠派对》百亿好友关系实现毫秒级查询
|
8天前
|
消息中间件 Cloud Native Serverless
RocketMQ 事件驱动:云时代的事件驱动有啥不同?
本文深入探讨了云时代 EDA 的新内涵及它在云时代再次流行的主要驱动力,包括技术驱动力和商业驱动力,随后重点介绍了 RocketMQ 5.0 推出的子产品 EventBridge,并通过几个云时代事件驱动的典型案例,进一步叙述了云时代事件驱动的常见场景和最佳实践。
115083 1
|
9天前
|
弹性计算 安全 API
访问控制(RAM)|云上安全使用AccessKey的最佳实践
集中管控AK/SK的生命周期,可以极大降低AK/SK管理和使用成本,同时通过加密和轮转的方式,保证AK/SK的安全使用,本次分享为您介绍产品原理,以及具体的使用步骤。
101861 3
|
8天前
|
自然语言处理 Cloud Native Serverless
通义灵码牵手阿里云函数计算 FC ,打造智能编码新体验
近日,通义灵码正式进驻函数计算 FC WebIDE,让使用函数计算产品的开发者在其熟悉的云端集成开发环境中,无需再次登录即可使用通义灵码的智能编程能力,实现开发效率与代码质量的双重提升。
95434 2
|
5天前
|
物联网 PyTorch 测试技术
手把手教你捏一个自己的Agent
Modelscope AgentFabric是一个基于ModelScope-Agent的交互式智能体应用,用于方便地创建针对各种现实应用量身定制智能体,目前已经在生产级别落地。
|
1天前
|
NoSQL Java Redis
使用Redis实例搭建网上商城的商品相关性分析程序
本教程将指导您如何快速创建实例并搭建网上商城的商品相关性分析程序。(ApsaraDB for Redis)是兼容开源Redis协议标准的数据库服务,基于双机热备架构及集群架构,可满足高吞吐、低延迟及弹性变配等业务需求。
17107 0
Doodle Jump — 使用Flutter&Flame开发游戏真不错!
用Flutter&Flame开发游戏是一种什么体验?最近网上冲浪的时候,我偶然发现了一个国外的游戏网站,类似于国内的4399。在浏览时,我遇到了一款经典的小游戏:Doodle Jump...
112765 12