什么是缓存
- 缓存就是数据库在内存中的零时容器
- 位于数据库与数据库访问层中间
- ORM在查询数据时首先会根据自身的缓存管理策略,在缓存中查找相关的数据,如果发现所需的数据,则直接将此数据作为结果加以利用
- 避免了数据库调用性能的开销
- 相对内存操作而言,数据库调用是一个代价高昂的过程。
缓存分类
- 一级缓存:即在当前事物范围内的数据缓存 - 就Hibernate来讲,(一级缓存)事物级缓存是基于Session的生命周期实现的,session一旦关闭,一级缓存就清除,一级缓存为hibernate自带的缓存,是必须的
- 应用级(二级)缓存:即在某个应用中或应用中某个独立数据库访问子集中的共享缓存,此缓存可由多个事物共享、 *-在Hibernate中,应用级缓存由SessionFactory实现
- 分布式缓存:即在多个应用实例,多个JVM间共享缓存策略。
延迟加载
- 实体对象的延迟加载
- 集合的延迟加载(一对多和多对多时,关联集合)
- 属性的延迟加载(clob大数据类型时)
colb 存放大文本的类型
blob 存放二进制数据的类型
Hibernate的悲观和乐观锁
- 多个用户肯能同时读取或更新一个数据
- 需要一些机制来保证这些数据在某个操作过程中不会被外界修改,这样的机制,也就是所谓的“锁”,即给我们选定的目标数据上锁,使其无法被其他程序修改
- 【悲观锁(Peaaimistic Locking)】
- 【乐观锁(Optimistic Locking6wby)】
数据库的隔离级别
Read UnCommited没有提交,就能读到。比如发出insert,在没有提交时就能更新数据库。
- 存在脏读,一个事物读取一行,另一个事物已经将该记录更新但没有提交
- 如果一个事物已经写数据,另一个事物则不允许同时进行写操作
Read Commited提交读。提交之后,才可以更新数据库
- 不存在脏读。 存在不可重复读
- 如果一个用户读出是张三,另一个用户将该用户名改为李四,那么一个用户再读则是李四
- 存在虚度,用户查询数据时,两次方寸内筒不一致,未提交的写事务将禁止其他事务进行操作。
Repeatable Read可重复读
读取的事物将禁止写事物,写事务则禁止任何其他事务不存在不可重复读,但不能避免虚读
Serializable可序列化读
事物只能一个接一个执行,不能并发执行。
悲观锁:
实现依赖于数据库的机制,在整个过程中,将数据锁定,其他任何用户不能对其读取和修改,一般适合于短事务,并发性不好
乐观锁
悲观锁保证操作独占性,性能开销巨大
乐观锁依靠数据版本记录机制实现
- 为数据增加一个版本标识,增加一个version字段
- 读取数据时,将版本号一同读出
- 跟新时,版本号加一
- 将提交数据的版本与数据库表对应记录的当前版本信息进行比对
- 如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。
#Hibernate实体关系映射
一对一有两种方式:
主键关联:从表的主键同时又是主表的外键。从表没有单独的外键。
外键关联:从表中存在外键列,关联主表的主键列。但外键列是不能重复的。
###cascade和inverse的区别
- cascade表示级联操作,当主表记录做操作时,从表记录做相应的操作,维护是记录。
- inverse表示控制反转。当属性设置为真时,表示由关联对象维护外键关系,当对象不做外键维护,维护的是外键。一般来说inverse设置在一方,外键由从表维护。