Hibernate缓存机制笔记

本文详细探讨了Hibernate的缓存机制,包括一级缓存Session和二级缓存。一级缓存减少数据库访问,二级缓存提供进程和集群范围的支持,并介绍了多种缓存插件如EHCache、OpenSymphony OSCache等。同时,文章讲解了如何配置二级缓存,涉及实体Bean的注解映射及persistence.xml配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.缓存简介
缓存介于应用程序和永久性数据存储源之间,目的是为了降低应用程序直接读取永久性数据存取源的效率,从而提高运行性能
2.Hibernate缓存
  • 缓存原理
对象在产生后,内存中就有了一个引用地址,Session加载了这个引用,保存在缓存中,只要不清空缓存,无论这个对象在事务过程中的值有何变化,引用地址都不改变。哪怕是变成null,但是在缓存中依然会保存原来的引用地址,再次使用时,读取的还是原来的引用地址,这即所谓的缓存。一个对象被其它生命周期未结束的对象引用,则这个对象的生命周期也不会结束。
  • 缓存作用范围
    • 事务范围
事务存在于内存中,在同一个事务缓存中,持久化类的每个对象都有一个唯一的OID,也就是Object ID,这个OID可以对应数据库中的代理主键
 
    • 进程范围
 进程范围内的缓存可以被当前进程内的所有事务共享,这些事务可能兵法访问缓存,为了避免脏数据,需要对事务上锁,对于缓存来说,就是需要对缓存中的数据采取必要的事务隔离机制。
    • 集群范围
在集群环境中,缓存被同一个机器或者多个机器上的多个进程共享,称为集群缓存,缓存中的数据被复制到集群环境中的美一个进程节点,进程之间通过远程通信来保证缓存中数据的一致性,断网了,一致性就无法保证了。
  •  缓存分类
    • 一级缓存--Session
      • 事务范围缓存
    • 二级缓存--由SessionFactory管理
      • 进程范围缓存
      • 集群范围缓存
  • 一级缓存-Session
    • Session作用
      • 减少访问数据库的频率
第一次访问:检查缓存中是否存在相应对象,没找到,就从数据库中查找相应的数据,把查找结果放在缓存中,返回对象引用
第二次访问:查找缓存中是否存在相应对象,找到,直接返回对象引用
    • 保证数据库中的相关记录与缓存中的相应对象保持同步
  • 二级缓存
    • Hibernate允许选用以下类型的缓存插件
      • EHCache--进程缓存,支持查询缓存
      • OpenSymphony OSCache--进程缓存,支持查询缓存
      • SwarmCache--集群缓存,不支持查询缓存
      • JBOSSCache--集群缓存,支持查询缓存,支持事务性并发访问的事务管理机制
    • 二级缓存接口适配器
    • 配置二级缓存主要步骤
      • 选择需要使用二级缓存的持久化类,设置它的第二季缓存的并发访问策略
      • 选择合适的缓存插件,每一种缓存插件都有自带的配置文件,因此需要手工编辑该配置文件
    • 配置ehcache缓存
      • 在Hibernate配置文件中,指定ehcache适配器
    • 在持久化类的映射文件中,配置<cache>元素
    • 编写ehcache.xml文件,并将此文件放在src文件夹下

3.Hibernate注解
Hibernate注解可用于注释类,属性,使用注解,可以省略类-表映射文件(hbm.xml文件)
Hibernate注解简化了对象关系映射的开发,通过注解方式可以自动生成数据库表
  • 使用注解进行对象映射的步骤
  1. 为每一个实体Bean使用@Entity注解
  2. 使用@ID指定实体Bean的标识属性
  3. 使用@Table指明当前实体Bean对应数据库哪张表
  4. 使用@GeneratedValue指定主键生成类型
  5. 修改Hibernate配置文件
  • 注解标签@Entity与@Id
  • 注解标签@Table
类级别的注解,可以指定当前类对应数据库中哪张表
  •  映射主键生成属性
使用@id可以将实体Bean的属性定义为标识符,该属性值可以通过应用自身定义.但是最好的方式是通过@GeneratedValue注解指定主键生成策略,生成策略使用@GeneratedValue的strategy属性定义
主键生成策略
Auto:根据不同的数据库选择不同的策略
TABLE:使用表保存id值
IDENTITY:使用数据库创建主键(mysql,sqlserver)
SEQUENCE:使用序列创建主键(Oracle)
  • 其他属性
其他属性时被@Basic注解注释的,但是次注解可以不写出来,志铭当前属性与数据表中的对应属性关联
另外,实体Bean中,只有非static非transient的属性可以被持久化
  • 开发示例:
    • 创建实体Bean,使用注解
    • 修改Hibernate配置文件,配置实体Bean的映射
    • 编写测试类

  • 映射查询
集中管理常用查询语句,直接在实体Bean中配置,使用简单
    • @NameedQuery
命名查询,使用HQL语句进行查询
 
name属性表示当前命名查询的标识符
query属性中写入查询HQL,其中HQL中的需要查询的变量条件使用":"来引用

示例:
    • @NamedNativeQuery与@SqlResultSetMapping
可以使用本地化查询,需要用@SqlResultSetMapping注解来志铭结果集结构

示例:
当所要查询的是表中所有数据,即实体Bean中所有属性,则可以使用以下更简洁的语法
 

4.EntityManager实体管理器
  • 配置EntityManager:
  • 创建persistence.xml文件,放到META-INF文件夹下
  • 使用EntityManagerFactory创建EntityManager对象
  • 进行事务处理了


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值