一级缓存(session缓存)
1、Session的save()方法持久一个对象后,该对象加入到session的缓存中,以后即使应用程序中的引用变量不再引用该对象,只要session的缓存中没有被清空,该对象仍然处于生命周期中。
2、当Session的get方法视图从数据库中加载对象时,Session优先判断缓存是否存在该对象,如果存在,则不需要去数据库中检索,对象是存在内存中的
Session清理缓存
清理缓存是指按照缓存中的对象的属性变化来同步更新数据库
清理缓存的时间点
1、调用commit(),commit()方法先清理缓存,然后再想数据库提交事务
2、调用Query查询接口等执行查询操作的时候,如果缓存中持久化了对象的属性变化,就会先清理缓存以保证查询结果为最新。
3、显示调用Session的flush()方法的时候
如何清理以及缓存?
1、通过session.clear();//清除所有缓存
2、session.evict();//清除指定缓存
二级缓存(SessionFactory缓存)
由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。
save、update、saveOrupdate、load、get、list、query、Criteria方法都会填充二级缓存
get、load、iterate会从二级缓存中取数据session.save(user)
如果user主键使用“native”生成,则不放入二级缓存.
第二级缓存是可选的,是一个可配置的插件,默认下SessionFactory不会启用这个插件。Hibernate提供了org.hibernate.cache.CacheProvider接口,它充当缓存插件与Hibernate之间的适配器。
Hibernate的二级缓存策略的过程如下:
1)条件查询的时候,总是发出一条select * from table_name where .....(选择所有字段)这样的SQl语句查询数据库,一次获得所有的数据对象。
2)把获得的所有数据对象根据ID放入到第二级缓存中。
3)当Hibernate根据ID访问数据对象的时候,首先从Session的一级缓存中查,查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。
4) 删除、更新、增加数据的时候,同时更新缓存。
Hibernate的二级缓存策略,是针对ID查询的缓存策略,对于条件查询则毫无作用。为此,Hibernate提供了针对条件查询的查询缓存(Query Cache)。
如何清除二级缓存?
需要用SessionFactory来管理二级缓存
什么样的数据适合存放到第二级缓存中?
1) 很少被修改的数据
2) 不是很重要的数据,允许出现偶尔并发的数据
3) 不会被并发访问的数据
4) 常量数据
不适合存放到第二级缓存的数据?
1) 经常被修改的数据
2) 绝对不允许出现并发访问的数据,如财务数据,绝对不允许出现并发
3) 与其他应用共享的数据
HIbernate是如何实现延迟加载
Hibernate3提供了属性的延迟加载功能,当hibernate在查询数据的时候,数据并没有存在于内存中,当程序真正对数据的操作时,对象才存在于内存中,就实现了延迟加载,它节省了服务器的内存开销,从而提高了服务器的性能。
OID查询
即我们平常使用的session.get(类名.class,cid);
HQL查询
hql:hibernate query lauguage即hibernate提供的一种查询语句,它和sql很相似,但是最大的区别是:SQL操作数据库表和字段,而hql操作的是实习类和属性。