深入Session
session概述
Session接口时Hibernate向应用程序提供的操纵对数据库的最主要的接口,他提供了基本的保存,更新,删除和加载Java对象的方法。
理解Session的缓存、
- 在session借口的实现中包含一些列的Java集合,这些Java集合构成了Session缓存,只要Session实力没有结束生命周期,存放在它缓存中的对象也不会结束生命周期
- 当session的save()方法持久化一个对象时,该对象被载入缓存,以后即使程序中不在引用该对象,只要缓存不清空,该对象仍然处于生命周期中。当时图load()对象时,会判断缓存中是否存在该对象,有则返回。没有在查询数据库
清理Session的缓存
- Session具有一个缓存,位于缓存中的对象称为持久化对象,它和数据库中的相关记录对应,Session能够在某些时间点,按照缓存中对象的变化来执行相关的SQl语句,来同步更新数据库,这一过程被称为清理缓存(flush)
- 默认情况下Session在以下时间点清理缓存:
- 当应用程序调用Transaction的commit()方法时,该方法先其清理缓存(session.flush()),饭后再向数据库提交事务(tx.commit())
- 当应用程序执行一些查询操作时,如果缓存中持久化对象的属性已经发生了变化,会先清理缓存,以保证查询结果能够反映持久化对象的最新状态
- 显式调用Session的flush()方法
- 区别:
- flush:进行清理缓存(此时缓存中饭的数据并不丢失)的操作,让缓存和数据库同步执行一系列的sql语句,但不提交事务;
- commit:先调用flush()方法,然后提交事务,则意味这提交事务对数据库的操作将会永久保存下来
- reresh:刷新,让session和数据库同步,执行查询,把数据库的最新信息显示出来,更新本体缓存的对象状态
- clear:清空缓存,等价于list.removeAll();
利用Session缓存读取持久化对象的数据
缓存的作用:
- 减少访问数据库的频率。
- 保证缓存中的对象与数据库中的相关记录保持同步。
Session执行批量操作
当Session执行批量操作时,应当定期的清理session的缓存下,这样才能保证足够的空间。
Hibernate检索策略
类级别检索策略
默认的检索策略是立即检索。在Hibernate映射文件中,通过<class>上配置lazy属性来确定检索策略。对于session的检索方式,类级别检索策略仅适用于load方法;也就是说,对于get、query建所以,持久化对象都会被立即加载而不管lazy时false还是true,一般来说,我们检索对象就是要访问它,英雌立即检索时通常的选择。由于load方法在检索不到对象时会抛出异常(立即检索的情况下),因此不建议使用load检索;而由于<class>中的lazy属性还影响到多对一及一对一的检索策略,因此使用load方法就更没必要了。
关联级别检索策略