今天我们学习下hibernate的缓存机制,何为缓存大家应该知道吧,简单的说就是减少访问数据库的次数,如果session里面有数据便不再去数据访问.想学里面的原理,慢慢听我道来:
Session的缓存的作用
• 当Session的save()方法持久化一个Customer对象时,Customer对象被加入到Session的缓存中,以后即使应用程序中的引用变量不再引用
Customer对象,只要Session的缓存还没有被清空,Customer对象仍然处于生命周期中。
• 当Session的load()方法试图从数据库中加载一个Customer对象时,Session先判断缓存中是否已经存在这个Customer对象,如果存在,就不需要再到数据库中检索。
这个地方打印的是true说名是同一个对象
session缓存的作用:
• (1)减少访问数据库的频率。应用程序从内存中读取持久化对象的速度显然比到数据库中查询数据的速度快多了,因此Session的缓存可以提高数据访问的性能。
• (2)保证缓存中的对象与数据库中的相关记录保持同步。当缓存中持久化对象的状态发生了变化,Session并不会立即执行相关的SQL语句,这使得Session能够把几条相关的SQL语句合并为一条SQL语句,以便减少访问数据库的次数,从而提高应用程序的性能。
Session清理缓存的时间点
清理缓存是指按照缓存中对象的状态的变化来同步更新数据库
Session会在下面的时间点清理缓存:
– 当应用程序调用org.hibernate.Transaction的commit()方法的时候,commit()方法先清理缓存,然后再向数据库提交事务。
– 当应用程序显式调用Session的flush()方法的时候。
hibernate的二级缓存sessionfactory
Hibernate提供了两级缓存,第一级缓存是Session的缓 存。由于Session对象的生命周期通常对应一个数据库事 务或者一个应用事务,因此它的缓存是事务范围的缓存。 第一级缓存是必须的,不允许而且事实上也无法被卸除。 在第一级缓存中,持久化类的每个实例都具有惟一的OID。
• 第二级缓存是一个可插拔的缓存插件,它由 SessionFactory负责管理。由于SessionFactory对象的 生命周期和应用程序的整个进程对应,因此第二级缓存是 进程范围的缓存。这个缓存中存放的是对象的散装数据。 第二级缓存是可选的,可以在每个类或每个集合的粒度上 配置第二级缓存。(后面spring还会讲解二级缓存)
对象的临时状态、持久化状态和游离状态
• 临时状态(transient):刚刚用new语句创建,还没有被持久化,不处于Session的缓存中。处于临时状态的Java对象被称为临时对象。
• 持久化状态(persistent):已经被持久化,加入到Session的缓存中。处于持久化状态的Java对象被称为持久化对象。
• 游离状态(detached):已经被持久化,但不再处于Session的缓存中。处于游离状态的Java对象被称为游离对象。
用Session的update()方法使游离对象转变为持久化对象
• Session的update()方法完成以下操作:
– (1)把Customer对象重新加入到Session缓存中,使它变为持久化对象。
– (2)计划执行一个update语句。值得注意的是,Session只有在清理缓存的时候才会执行update语句,并且在执行时才会把Customer对象当前的属性值组装到update语句中。因此,即使程序中多次修改了Customer对象的属性,在清理缓存时只会执行一次update语句。