Hibernate一级缓存
什么是缓存:将数据提前存放到内存中的某一个位置,当再次使用的时候,可以直接从内存里获取
缓存的好处:提升程序的运行效率,缓存技术是Hibernate的优化手段
Hibernate分成两个基本的缓存
1,一级缓存:session级别的缓存,一级缓存与session的生命周期一致,自带的
2,二级缓存:sessionfactory级别的缓存,不是自带的
证明缓存的存在:
因为查询的是同一条记录 当第一次查询出来的时候数据就被hibernate储存到了一级缓存里
当第二次查询时就不需要去执行sql语句到数据库查询了,直接获取缓存里的
实例代码:
理解一级缓存
在session接口的实现中包含一系列的java的集合,这些Java集合构成了session的缓存
只要session实例没有结束生命周期,存放在它缓存的对象也不会结束生命周期
当session对象的save()方法持久化一个对象时,该对象被载入缓存,以后即使程序不调用该对象,只要缓存不清空,该对象仍处于生命周期中
当试图get(),load()对象时,会判断缓存中是否存在该对象,有则返回,此时不查询数据库,没有再查询数据库
Session能够在某些时间点,按照缓存中对象的变化来执行相关的sql语句,来同步更新数据库,这一过程被称为刷出缓存(flush)
默认情况下Session在以下时间点刷出缓存:
当程序调用Transaction的commit()方法时,该方法先输出缓存,然后再向数据库提交事务
当应用程序执行一些查询操作时,如果缓存中持久化对象的属性已经发生了变化,会先刷出缓存,以保证查询结果能够反映持久化对象的最新状态
调用Session的flush()方法
持久化对象有自动更新数据库的功能能自动更新的原因是:依赖Hibernate的一级缓存
Hibernate向一级缓存中存入数据的同时,还会复制一份数据库存入Hibernate快照中,当调用commit()方法时,会清理一级缓存中的数据操作
同时会检查一级缓存中的数据和快照区的数据是否相同,如果不同则会执行update()方法,将一级缓存的数据同步到数据库中,并更新快照区
反正,则不会执行update()方法