Hibernate缓存

一、Hibernate缓存概述

Hibernate中提供两个级别的缓存,一级缓存和二级缓存。

1。一级缓存是会话级别的缓存,它属于事物范围的缓存,一级缓存有hibernate进行管理。

2。二级缓存是sessionFactory级别的缓存,它属于进程范围的缓存,二级缓存又可分为“内置缓存”和“外置缓存”,内置缓存:是hibernate在创建sessionFactory时会加载.hbn.xml文件并会在内存中初始化一些默认的sql语句,该内置缓存是只读的,外置缓存(二级缓存),默认sessionFactory不会启动这个缓存插件,外置缓存中的数据是数据库中数据的复制,存储的物理介质可以是内存或者硬盘。

二,hibernate一级缓存

会话的缓存有两大作用:

1。减少访问数据库的频率。

2。保证数据库中的相关记录与缓存中的相关对象保持一致。

会话根据脏对象的最新属性执行相关SQL语句,从而保证了数据库中的相关记录与缓存中的响应对象的同步,默认在如下时间点,会议会清理缓存:

1。应用程序调用事务的提交()方法时,提交()会先清理缓存,再向数据库提交事务。

2。应用程序执行一些查询操作,缓存中的持久化对象的属性发生变化时。

3。显式调用会话的冲洗()方法。

会话提供了两个管理缓存的方法:

1。驱逐(对象obj);从缓存中清除特定持久化对象。

2.清楚();清空缓存中,所有持久化对象。

三,Hibernate二级缓存

1。使用Hibernate二级缓存的步骤:

1)。加入二级缓存插件的jar包及配置文件:

我。复制\ hibernate-release-4.2.4.Final \ lib \可选\ ehcache \ *。jar到当前Hibrenate应用的类路径下。
。复制hibernate-release-4.2.4。最终项目\ \ etc \ ehcachexml到当前网络应用的类路径下

2)。配置hibernate.cfg。xml

我。配置启用hibernate的二级缓存
& lt;属性name=" cache.use_second_level_cache祝辞true

二世。配置hibernate二级缓存使用的产品
& lt;属性name=" hibernate.cache.region.factory_class祝辞org.hibernate.cache.ehcache.EhCacheRegionFactory

三世。配置对哪些类使用hibernate的二级缓存
& lt;类缓存使用=岸列础崩?" com.atguigu.hibernate.entities.Employee "/祝辞

实际上也可以在pojo所用的. hbm。xml文件中配置对哪些类使用二级缓存,及二级缓存的策略是什么。

2)。集合级别的二级缓存的配置

我。配置对集合使用二级缓存

& lt; collection-cache使用=岸列础?癱om.atguigu.hibernate.entities.Department.emps”/集合在

也可以在pojo所用的. hbm。xml文件中进行配置

& lt;集名称=癳mps”表=癎G_EMPLOYEE”逆=" true "懒=" true "在
& lt;缓存使用=岸列础?祝辞
& lt; key>
& lt;列名=癉EPT_ID”/祝辞
& lt;/key>
& lt;一对多类=" com.atguigu.hibernate.entities。员工“/祝辞
& lt;/set>

二世。注意:还需要配置集合中的元素对应的持久化类也使用二级缓存!否则将会多出n条SQL语句。

3)。ehcache的配置文件:ehcache。xml

4)。查询缓存:默认情况下,设置的缓存对HQL及QBC查询时无效的,但可以通过以下方式使其是有效的

我。在hibernate配置文件中声明开启查询缓存

& lt;属性name=" cache.use_query_cache祝辞true

二世。调用查询或标准的setCacheable(真正的)方法
@Test
公共空testQueryCache () {
=会话查询查询。createQuery(“雇员”);
query.setCacheable(真正);

Listemp=query.list ();
System.out.println (emps.size ());

emps=query.list ();
System.out.println (emps.size ());

标准标准=session.createCriteria (Employee.class);
criteria.setCacheable(真正);
}
三世。查询缓存依赖于二级缓存(使用查询缓存的前提是配置hibernate二级缓存)

示例:





Hibernate缓存