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