Hibernate性能(缓存、悲观锁、乐观锁)

什么是 缓存
缓存就是数据库数据在内存中的临时容器
位于数据库与数据库访问层中间
orm在查询数据时首先会根据自身的缓存管理策略,在缓存中查找相关数据,如发现所需要的数据,则直接将此数据作为结果加以利用
避免了数据调用性能的开销
相对内存操作而言,数据库四调用是一个高昂的过程
缓存分类:
一级缓存 :即在当前事务范围内的数据缓存
就Hibernate来讲, (一级缓存)事务级缓存是基于 Session的生 命 周期实现的,session一旦关闭,一级缓存就清除,一级缓存为hibernate自带的缓存,是必需的。
应用级缓存(二级) :即在某个应用中某个独立数据库访问子集中的共享缓存,此缓存可由多个事务共享。
在Hibernate中,应用级缓存由 SessionFactory 实现
分布式缓存 :即在多个应用实例,多个JVM间共享的缓存策略
延迟加载 就是当在真正需要数据的时候,才真正执行数据加载操作
hibernate 3.x的lazy(延迟加载)默认是true,需要注意
延迟加载的类型:
实体对象的延迟加载(load())
集合的延迟加载(一对多和多对多时,关联集合)
属性的延迟加载(clob大数据类型时)

clob:专门存放大文本的类型
blob:存放二进制数据的类型


Hibernate事务处理
事务是一组原子操作, 所有原子操作要么全部执行成功,要么全部失败


Hibernate的悲观和乐观锁
多个用户可能同时读取或者更新一个数据
需要一些机制来保证这些数据在某个操作过程中不会被外界修改,这样的机制,也就是所谓 的“锁”,即给我们选定的目标数据上锁,使其无法被其他程序修改
Hibernate支持两种锁机制
- “ 悲观锁 (Pessimistic Locking)”
- “ 乐观锁 (Optimistic Locking)”。
悲观锁:
每次在存取数据的时候,其他用户也会存取同一数据
对数据进行锁定,直到自己操作完成以后
依靠数据库提供的锁机制
实现依赖于数据库机制,在整个过程中,将数据锁定,其它任何用户不能对其读取和修改,一般适合于短事务,并发性不好
乐观锁:
悲观锁保证操作独占性,性能开销巨大
乐观锁依靠数据版本记录机制实现
- 为数据增加一个版本标识 ,增加一个version字段
- 读取数据时,将版本号一同读出
- 更新时,版本号加一
- 将提交数据的版本与数据库表对应记录的当前版本信息进行比对
- 如果提交的数据 版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据

数据库隔离级别
Read UnCommited 没有提交,就能读到。比如发出insert,在没有提交时就能更新数据库。
存在脏读,一个事务读取一行,另一个事务已经将该记录更新但没有提交
如果一个事务已经写数据,另一个事务则不允许同时进行写操作
Read Commited 提交读。提交之后,才可以更新数据库
不存在脏读。存在不可重复读。
如果一个用户读出是张三。另一个用户将该用户名改为李四,那么第一个用户再读则是李四
存在虚读,用户查询数据时,两次查询的内容不一致 未提交的写事务将会禁止其他事务访问该行

Repeatable Read 可重复读
读取的事务将禁止写事务,写事务则禁止任何其他事务不存在不可重复读,但不能避免虚读
Serializable 可序列化读
事务只能一个接一个执行,不能并发执行
Hibernate常见的优化策略
用高版本的hibernate
制定合理的缓存策略
采用合理的session管理机制
尽量使用延迟加载
如有可能,采用UUID作为主键生成策略
如有可能,选用乐观锁代替悲观锁
在开发中,显示hibernate执行的SQL语句,从而指定更好的实现策略
复杂查询和统计查询可以使用SQL语句完成,甚至可以考虑使用存储过程完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值