什么是session缓存?
session的缓存:在 Session 接口的实现中包含一系列的 集合(List),这些集合用于保存本次session创建/修改/查询出来的对象, 这些 集合(List)构成了 Session 缓存. 只要 Session 实例没有结束生命周期, 存放在它缓存中的对象也不会结束生命周期
一级缓存是默认开启的Session每次查询数据时,都会从一级缓存中取数,若存在则直接返回数据,如果缓存中没取到数据,则查询数据库,并将查询结果放入缓存中。
比如当你使用一个save()方法去保存一个对象的时候,这个时候只要缓存不清空,那么在后续的操作中可以不访问数据库通过访问缓存进行查询操作。
如何操作session缓存数据?
session.flush:将缓存中状态为未同步的对象先同步到数据库内存中(并未保存到数据库物理硬盘),并标注刚才完成同步的对象状态为已同步,实际就是执行一系列sql语句,但不提交事务,;(增删查改同步到数据库内存,但是不提交)
transation.commit:先调用flush() 方法,然后提交事务. 则意味着提交事务意味着对数据库操作永久保存下来。
session.refresh:刷新,让session和数据库同步,执行查询,把数据库的最新信息显示出来,更新本地缓存的对象状态.(使用查询语句刷新内存,让内存信息与数据库保持一致性)。
session.evict(obj):将参数中的对象在session缓存中清除。
session.clear:清空缓存,等价于list.removeAll();
session.close:清空Session的缓存,关闭session资源。
什么是快照?
当session加载了对象后,会在session中创建一个该对象的副本,副本的属性值与数据库中的值相同,该副本也成为快照。当session清理缓存时,通过比较对象的当前属性和快照的属性值,来判断对象的哪些属性发生了变化。
* 发生变化的执行sql语句
* 没有发生变化不再执行语句
(在执行内存语句之前先取得数据库信息确定是否需要执行增删改语句)
快照机制有效的减少了数据库操作。
什么是hibernate状态?
Hibernate 把对象分为 4 种状态:
临时状态:刚new出来的java对象,这个时候还没与hibernate产生关联。下一步通过save()进入持久化状态.
持久化状态:已经存在session中只等同步就会更新到数据库中。
游离状态:已经被清理出session,这个时候可以通过引用保存,跟临时状态差不多,但是可以用过lock()方法回到持久化状态
删除状态:执行了delete方法后的删除状态。无法回到持久化状态