Hibernate学习笔记之高级特性

最近没什么工作,从头开始学习Hibernate,以下是看《Hibernate开发指南》的一点笔记,保存一下。

一、Hibernate锁
Hibernate支持两种锁机制:悲观锁(pessimistic locking)和乐观锁(optimistic locking)。
悲观锁在整个数据处理过程中数据处于锁定状态,即独占模式。悲观锁的实现,往往依靠数据库提供的锁机制(只有数据库层提供的锁机制才能保证真正的排他性,否则即使在本系统加锁也无法保证外部系统不会修改数据)。
Hibernate的加锁模式有:
LockMode.NONE 无锁,
LockMode.WRITE Hibernate在insert和update时自动获取,
LockMode.READ Hibernate在读记录时自动获取,
LockMode.UPGRADE 利用数据库的for update子句加锁,
LockMode.UPGRADE_NOWAIT 利用oracle的for update nowait 子句加锁。
加锁一般通过以下方法实现:
Criteria.setLockMode,Query.setLockMode,session.lock

乐观锁在一定程度上解决悲观锁的独占造成性能低下的问题,乐观锁大多基于数据版本(version)记录机制实现:读取数据时将版本号一同读出,更新时版本号加一,提交时拿提交数据的版本信息与数据库表对应记录的当前版本信息进行对比,如果提交的数据的版本号大于数据库表当前版本号,则更新,否则认为是过期数据。

 

二、Hibernate分页
Hibernate对不同数据库进行统一接口设计,在抽象类net.sf.hibernate.dialect指定所有底层数据库的对外统一接口,针对不同的数据库提供相应的dialect实现,例如。Criteria和Query都提供分页的方法。

 

三、延迟加载(Lazy loading)
为了避免一些情况下关联关系带来的无谓的性能开销,Hibernate引入了延迟加载的概念。所谓延迟加载,就是在需要数据的时候才真正执行数据加载操作。
可以使用Hibernate.initialize方法可以强制加载关联对象。

 

四、事务管理
Hibernate是JDBC的轻量级封装,本身并不具备事务管理能力,在事务管理层Hibernate将其委托给底层的JDBC或者JTA。Hibernate的默认事务处理机制基于JDBC Transaction。
基于JDBC的事务管理:session=sessionFactory.openSession();Transaction tx=session.beginTransaction(); ....  tx.commit();
基于JTA的事务管理:JTA提供了跨session的事务管理能力。JTA事务管理基于JTA容器实现。
使用方式:在hibernate.cfg.xml中添加

示例代码:

 

 

五、Hibernate缓存
Cache可以减少频繁的网络传输和数据库查询,提高系统性能。
Hibernate作为应用程序级数据访问层封装,只能在其作用范围内保持Cache中数据的有效性。在第三方系统共享数据库的情况下,Hibernate的Cache机制可能失效。Hibernate在本地的JVM中维护了一个缓冲池,并将从数据库读取的数据保存到池中以供下次重复使用(如果Hibernate中的数据发生了变动,Hibernate同样也会更新池中的数据版本)。外部系统的定义并非局限于本系统之外的第三方系统,本系统中也会出现绕过Hibernate数据存储机制的其他数据存取手段,如JDBC。
Hibernate中的Cache大致分为两层:第一层Cache在session中实现,属于事务级数据缓冲,一旦事务结束Cache也就失效。此层Cache为内置实现无需关注;第二层Cache是Hibernate中对其实例范围内的数据进行缓存的管理容器。早期版本的Hibernate采用JCS作为默认第二层Cache实现,新版本的Hibernate采用EHCache作为默认的第二级Cache实现。

 

六、Session管理
Session管理的目标聚焦于通过合理的设计,避免Session的频繁创建和销毁,从而避免大量的内存开销和频繁的JVM垃圾回收。
SessionFactory负责创建Session,SessionFactory是线程安全的,多个并发线程可以同时访问一个SessionFactory并从中获取Session实例。而Session并非线程安全,如果多个线程同时使用一个Session实例进行数据存取,将会导致Session数据存取逻辑混乱。
在各种Session解决方案中ThreadLocal模式得到了大量使用,通过 ThreadLocal存取的数据总是与当前线程相关。ThreadLocal为每个线程维护一个私有的变量空间,实现原理是在JVM中维护一个Map,Map的key是当前的线程对象,而value是线程通过TreadLocal.set()方法保存的实例对象。当线程调用ThreadLocal.get()方法时ThreadLocal会根据当前线程对象取出Map中对应的对象。
新版本的Hibernate在处理Session的时候内置了延迟加载机制,只有真正发生数据库操作时才会从数据库连接池获取数据库连接。

 

七、Hibernate In Spring
通过在Spring中配置dataSource、SessionFactory、transactionManager等实体bean,替代hibernate.cfg.xml,简化数据库操作。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值