一级缓存
1、当session的save()方法持久化一个customer对象时,customer对象被加载到session的缓存中,以后即使应用程序中的引用变量不再引用customer对象,只要session的缓存还没有被清空,customer对象仍然处于生命周期中。
2、当session的get()方法试图从数据库中加载一个customer对象时,session先判断缓存中是否已经存在这个customer对象,如果存在吗,就不需要到数据库中检索。从而大大提高应用性能
缓存作用:
1、减少访问数据库的频率。用用程序从内存中读取持久化对象的速度显然比到数据库中查询数据的速度快多了,因此session的缓存可以提高数据访问的性能。
2、保证缓存中的对象与数据库中的相关记录保持同步,当缓存中的持久化对象的属性发生了变换,session并不会立即执行相应的sql语句,这使得session呢呢个够把几条相关的sql语句合并成一条sql语句,以便减少访问数据库的次数,从而提高应用程序的性能
session清理缓存:
1、清理缓存是指按照缓存中对象的属性的变换来同步更新数据库
以下程序代码对customer的name属性修改了两次
tx=session.beginTransaction();
Customer customer=(Customer)session.get(Customer.class,new Long(1));
customer.setName("JACK");
customer.setName("TOM");
tx.commit();
当session清理缓存时,只需要执行一条update语句;
update CUSTOMER set NAME='TOM' ..... where ID=1;
session会在下面的时间点清理缓存;
当应用程序调用org.hibernate.Transcation的commit()方法的时候,commit()方法先清理缓存,然后再向数据库提交事务。
当应用程序通过HIbernate的query接口等执行查询操作时,如果缓存中持久化对象的属性发生了变化,就会先清理缓存,以保证查询结果能反映持久化对象的最佳状态
当应用程序显示调用是session的flush()方法的时候。
二级缓存
1、hibernate提供了二级缓存,第一级缓存是session缓存。由于session对象的声明周期通常对应一个数据库事务,因此他的缓存事务范围的缓存。第一级缓存是必须的,不允许而且事实上也不能卸载。在第一级缓存中,持久化类的每个实例都具有唯一OID。
2、第二级缓存是一个可插拔的缓存插件,他由SessionFactory负责管理。由于SessionFactory对象的生命周期和应用程序的整个进程相对应,因此第二级缓存是进程范围或群集范围的缓存。这个缓存中存放的是对象的散装数据。第二级缓存是可选的,可以在每个类或每个集合的粒度上配置第二级缓存
hibernate应用中java对象的状态
临时状态(transient):刚刚用new语句创建,还没有被持久化,不处于session的缓存中,楚雨淋湿状态的java对象被称为临时对象。
持久化状态(persistent):已经被持久化,加入到session 的缓存中,处于持久化状态的java对象被称为持久化对象。
游离状态(detached);已经被持久化,但不再处于session的缓存中。处于游离状态的java对象被称为游离对象。
删除状态(removed):OID不为null,从一个session的实例的缓存中删除。session在清理缓存时,会执行SQL delete语句,删除数据库中的相应记录。一般情况下,应用程序不应该再使用被删除的对象