- 1、本文档共27页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
hibernate高级应用选编
Hibernate高级应用;Hibernate事务和并发处理
Hibernate缓存策略
批量处理
延迟加载;什么是事务?
单个逻辑工作单元,它包含一系列的操作。
事务的特性(ACID)
原子性
一致性
隔离性
持久性
;1.脏读取(Dirty Reads)
一个事务读取了另一个事务未提交的数据
2.不可重复读(Non-repeatable Reads)
一个事务再次读取之前曾读过的数据时,发现该数据已经被另一个提交的事务修改
3.虚读(幻读)
一个事务重新执行一个查询,返回一套符合条件的记录,但这些记录中包含了因为其他最近提交的事务而产生的新记录
;1.脏读取(Dirty Reads);2.不可重复读;虚读(幻读);数据库事务管理隔离级别;Hibernate是JDBC轻量级的封装,本身不具备事务的管理能力,在事务管理层委托给底层的JDBC或JTA进行事务的管理和调度。
1. 基于JDBC的事务管理
;JDBC的事务是有Connection管理的,事务的周期依赖于Connection的生命周期。而Session依托于Connection实现的,事务局限与session的生命周期。
提供了跨越session的事务管理能力。;Hibernate隔离级别的设置;悲观锁(perssimistic locking)
在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现往往依靠数据库提供的锁机制。
乐观锁(optimistic locking)
乐观锁并没有对任何操作加锁,它只是在事务更新记录时,对事务进行检查,看从上一次读取这条记录后,它是否被其他事务修改.
;悲观锁是解决事务并发的一种方法,悲观锁是在更新数据时把记录锁住,防止其他事务读写这个记录.
Hibernate的加锁模式有
LockMode.NONE(无锁机制)
LockMode. WRITE:当向数据库中插入或更新数据时,Hibernate会自动使用这种锁。
LockMode.READ:Hibernate在读取记录时自动获取
注:以上三种机制为Hibernate 内部对数据的锁定机制,与数据库无关。
LockMode.UPGRADE:利用数据库的for update子句加锁
LockMode.UPGRADE_NOWAIT:Oralce的特定实现,利用oracle的for update nowait子句加锁
;Hibernate提供了三种方法来检查数据是否发生了变化。
1.使用version实现乐观锁
2.使用时间戳实现乐观锁
3.对比字段值实现乐观锁
其中已使用version的方法最为常用。
步骤:
1.首先为映射文件(xx.hbm.xml)中的class节点添加
optimistic-lock属性
2.在Id节点下添??version节点
class name=“net.xabc.entity.TUser” optimistic-lock =“version”
id name=“…”
id
version name=“version” column=“version” type=“java.lang.Integer”
/class;缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能。
ORM缓存策略
1.事务级缓存(session level cache)
session生命周期的缓存,关闭session即消亡
2.应用级/进程级缓存(sessionFactory level cache)
某个应用中的共享缓存,多个事务可以共享,在sessionFactory层实现,所有sessionFactory创建的session可以共享.
3.分布式缓存
多个JVM共享的缓存,通过远程机制实现缓存数据同步,任意实例修改数据,所有的JVM都要更新缓存.
;1.内部缓存(session level)
一级缓存是事务级的缓存,session中维护的一个Map,Map的key是包含了数据类型和id,从数据库加载的数据都会进入Map缓存中,通过session加载数据时会先在session缓存里找,一级缓存是session的private数据,session实例消亡就清除了,在应用中就保持在一次请求的开始和结束之间.
一般由Hibernate自动维护,也支持手动维护
session.evit(Object obj) 将持久化对象从一级缓存中清除.
session.clear() ?清空一级缓存
session.contains(Object obj) 判断指定的对象是否存在于一级缓存中.?
session.flush() 刷新一级缓存区的内容,使缓存与数据库数据保持同
文档评论(0)