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

来源:互联网 发布:linux ssh安装失败 编辑:程序博客网 时间:2024/05/04 06:31
什么是缓存
缓存就是数据库数据在内存中的临时容器
位于数据库与数据库访问层中间
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语句完成,甚至可以考虑使用存储过程完成。
0 0
原创粉丝点击