`

hibernate中悲观锁和乐观锁和lazy加载

阅读更多
hibernate中经常用到当多个人对同一数据同时进行修改的时候,会发生脏数据,造成数据的不一致性,解决办法是可以通过悲观锁和乐观锁来实现。
悲观锁:在数据有加载的时候就给其进行加锁,直到该锁被释放掉,其他用户才可以进行修改,优点:数据的一致性保持得很好,缺点:不适合多个用户并发访问。当一个锁住的资源不被释放掉的时候,这个资源永远不会被其他用户进行修改,容易造成无限期的等待。
乐观锁:就是在对数据进行修改的时候,对数据才去版本或者时间戳等方式来比较,数据是否一致性来实现加锁。优点比较好。



1、在悲观锁中,只要在加载的时候,才去session中的load方法,进行枷锁,session.load(****.class,1,LockMode.UPDATE);

      Hibernate将事务管理委托给底层的JDBC或者JTA,默认是基于JDBC Transaction的。
      Hibernate支持“悲观锁(Pessimistic Locking)”和“乐观锁(Optimistic Locking)”。
      悲观锁对数据被外界修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制。Hibernate通过使用数据库的for update子句实现了悲观锁机制。Hibernate的加锁模式有:
      1. LockMode.NONE:无锁机制
      2. LockMode.WRITE:Hibernate在Insert和Update记录的时候会自动获取
      3. LockMode.READ:Hibernate在读取记录的时候会自动获取
      4. LockMode.UPGRADE:利用数据库的for update子句加锁
      5. LockMode.UPGRADE_NOWAIT:Oracle的特定实现,利用Oracle的for update nowait子句实现加锁
2、乐观锁大多是基于数据版本(Version)记录机制实现。Hibernate在其数据访问引擎中内置了乐观锁实现,可以通过class描述符的optimistic-lock属性结合version描述符指定。optimistic-lock属性有如下可选取值:
      1. none:无乐观锁
      2. version:通过版本机制实现乐观锁
      3. dirty:通过检查发生变动过的属性实现乐观锁
      4. all:通过检查所有属性实现乐观锁


2、乐观锁:
1>在悲观锁的基础上加入private int version;和相关的setter、getter方法。
2>映射文件配置在class标签里面加入optimistic-lock="version",然后在的id标签后面加入<version name="version"/>

<hibernate-mapping>
	<class name="com.langhua.hibernate.pojo.CollectionMapping" table="t_lock" optimistic-lock="version">
		<id name="id">
			<generator class="native"/>
		</id>
		<version name="version"/>
		<property name="name"/>	
		<property name="totle"/>			
	</class>
</hibernate-mapping>


lazy策略可以用在:
* <class>标签上:可以取值true/false
* <property>标签上,可以取值true/false,这个特性需要类增强
* <set>/<list>等集合上,可以取值为true/false/extra
* <one-to-one>/<many-to-one>等标签上,可以取值false/proxy/no-proxy

重要的概念:
1、lazy的概念,指在需要的时候才发出sql
2、lazy策略只是在session打开期间才是有效的


注意:
Hibernate类级别的lazy加载策略:可以控制什么时候加载这些普通对象属性

Hibernate集合属性的懒加载策略:

在集合属性上,可以配置懒加载策略,取值为:true/false/extra

true:默认取值,它的意思是只有在调用这个集合获取里面的元素对象时,才发出查询语句,加载其集合元素的数据

false:取消懒加载特性,即在加载对象的同时,就发出第二条查询语句加载其关联集合的数据
extra:一种比较聪明的懒加载策略,即调用集合的size/contains等方法的时候,hibernate并不会去加载整个集合的数据,而是发出一条聪明的SQL语句,以便获得需要的值,只有在真正需要用到这些集合元素对象数据的时候,才去发出查询语句加载所有对象的数据


Hibernate单端关联懒加载策略:即在<one-to-one>/<many-to-one>标签上可以配置
懒加载策略。

可以取值为:false/proxy/no-proxy
false:取消懒加载策略,即在加载对象的同时,发出查询语句,加载其关联对象
proxy:这是hibernate对单端关联的默认懒加载策略,即只有在调用到其关联对象的方法的时候才真正发出查询语句查询其对象数据,其关联对象是代理类no-proxy:这种懒加载特性需要对类进行增强,使用no-proxy,其关联对象不是代理类

注意:在class标签上配置的lazy属性不会影响到关联对象!!!
分享到:
评论

相关推荐

    Hibernate性能(缓存 延迟加载 事务 悲观 乐观锁).ppt

    【Hibernate性能优化】:在Java开发中,Hibernate作为流行...在实际开发中,开发者应根据业务场景选择合适的锁定策略,并结合缓存和延迟加载技术,以及优化SQL查询,来平衡性能和数据一致性,实现高效的Hibernate应用。

    hibernate5.0中文文档

    此外,还会讨论乐观锁(Optimistic Locking)和悲观锁(Pessimistic Locking)的实现方法。 除此之外,文档还会介绍第二级缓存(Second Level Cache)和查询缓存(Query Cache),这两种缓存机制能显著提升应用程序...

    Hibernate4.1.11中文手册

    同时,也会讨论乐观锁(Optimistic Locking)和悲观锁(Pessimistic Locking)的使用场景和实现方法。 查询是Hibernate的重要功能,手册会详细讲解HQL和Criteria API的用法。HQL类似于SQL,但更为面向对象,可以...

    hibernate文档总结,技术汇总,PDF版的,hibernate简明参考文档

    12. **版本控制**: Hibernate通过乐观锁或悲观锁机制实现对象版本控制,防止并发更新引发的数据不一致问题。 13. **关联映射**: Hibernate支持一对一、一对多、多对一和多对多的关联映射,允许对象之间建立复杂的...

    Hibernate 3.1.2中文文档

    Hibernate 支持乐观锁和悲观锁机制,保证在并发环境下的数据一致性。 总之,Hibernate 3.1.2中文文档详尽地介绍了如何使用Hibernate进行数据库操作,包括配置、实体映射、查询以及性能优化等多个方面,是Java开发者...

    hibernate文档杂

    6. **对Hibernate的疑问和问题**:`对hibernate的疑问.txt`和`hibernate中奇怪的问题.txt`可能是作者在学习和实践过程中遇到的难点或异常情况,这些问题可能涉及到懒加载(lazy loading)、代理对象、事务管理等复杂...

    Hibernate4.1

    14. **版本控制(Optimistic Locking/Pessimistic Locking)**:Hibernate提供乐观锁和悲观锁来防止并发访问时的数据冲突。 15. **事件监听器**:可以通过实现特定接口或使用注解来监听持久化过程中的各种事件,如...

    Hibernate学习笔记

    在使用Hibernate进行并发操作时,可以利用乐观锁和悲观锁机制来处理并发问题。乐观锁假设多个事务在处理同一数据时不会经常发生冲突,而悲观锁则在操作数据时始终锁定该资源。 Hibernate还支持操作树形结构的数据,...

    HIBERNATE中文参考文档

    - **乐观锁与悲观锁**:提供数据并发控制机制,保证多用户环境下的数据一致性。 ### 实践建议 在实际项目中应用Hibernate时,开发者应充分考虑数据库设计、性能优化、异常处理等方面,合理利用Hibernate提供的各种...

    hibernate源码

    此外,Hibernate还提供了乐观锁和悲观锁策略,用于并发控制。 七、延迟加载(Lazy Loading) 延迟加载是Hibernate的一个重要特性,它只在真正需要时才加载关联对象,从而避免了大量无谓的数据获取。这种机制依赖于...

    hibernate3.0纯jar包

    14. **实体的版本控制**: Hibernate支持乐观锁和悲观锁机制,确保在并发环境下数据的一致性。 15. **连接池集成**: Hibernate可以与其他连接池(如C3P0、Apache DBCP等)集成,有效管理数据库连接,提高系统性能。 ...

    hibernate3.5中文文档

    13. **高级特性**:包括实体生命周期的事件监听、回调方法、状态转换、实体的版本控制(乐观锁、悲观锁)等。 阅读《Hibernate 3.5 中文文档》能帮助开发者全面理解Hibernate的功能和使用方法,无论你是初学者还是...

    hibernate V3.12中文参考手册

    9. **事务和并发控制**:Hibernate支持JTA和JDBC两种事务管理方式,并提供了乐观锁和悲观锁来处理并发问题。 10. **关联映射**:Hibernate支持一对一、一对多、多对一、多对多等各种关联映射,通过外键、集合等手段...

    hibernate-3.2.6

    12. **版本控制**:Hibernate支持乐观锁和悲观锁,保证并发环境下的数据一致性。 通过学习和使用Hibernate 3.2.6,开发者可以更专注于业务逻辑,而不必过多关注底层数据库的细节,从而提高开发效率和代码可维护性。...

    Hibernate3中文帮助手册

    手册会详细阐述Session的生命周期、缓存机制以及事务处理,包括乐观锁和悲观锁的概念。 五、查询语言HQL与Criteria API Hibernate提供了自己的查询语言HQL(Hibernate Query Language),类似于SQL,但面向对象。...

    hibernate中文文档

    5. 了解并适当地使用乐观锁和悲观锁控制并发。 总结,《Hibernate中文文档》是Java开发者学习和掌握Hibernate的宝贵资源,无论你是初学者还是有经验的开发者,都能从中找到所需的信息,提升开发效率,实现更加优雅...

    Hibernate开发指南

    此外,还讲解了悲观锁和乐观锁的使用,这两者用于处理并发访问时数据的一致性问题。 Hibernate分页功能允许开发者在查询时分批次加载数据,这对于操作大量数据的场景非常有用。Cache管理部分介绍了Hibernate的二级...

    HIBERNATE官方参考手册

    20. **实体的版本控制(Versioning)**:通过乐观锁或悲观锁实现并发控制,防止数据冲突。 通过深入阅读《Hibernate官方参考手册》,开发者可以全面掌握Hibernate的使用方法,从而高效地开发Java应用程序的数据访问...

    hibernate中文参考文档

    - **并发问题**: 使用乐观锁或悲观锁机制。 - **映射配置错误**: 检查mapping文件或注解是否正确配置。 #### 十二、最佳实践 - **代码组织**: 将Hibernate相关的代码按照功能模块划分。 - **单元测试**: 编写单元...

Global site tag (gtag.js) - Google Analytics