version 必须配置在id后面
缓存文件在映射文件后面
一级缓存:session回话级别
Session缓存的作用
(1)减少访问数据库的频率。应用程序从内存中读取持久化对象的速度显然比到数据库中查询数据的速度快多了,因此Session的缓存可以提高数据访问的性能。
(2)保证缓存中的对象与数据库中的相关记录保持同步。当缓存中持久化对象的状态发生了变化,Session并不会立即执行相关的SQL语句,这使得Session能够把几条相关的SQL语句合并为一条SQL语句,以便减少访问数据库的次数,从而提高应用程序的性能。
Session的清理缓存
清理缓存是指按照缓存中对象的状态的变化来同步更新数据库,下面我们还是具体来看一段代码:以下程序代码对Customer的name属性修改了两次:
tx = session.beginTransaction(); Customer customer=(Customer)session.load(Customer.class, new Long(1)); customer.setName("Jack"); customer.setName("Mike"); tx.commit();
当Session清理缓存时,只需执行一条update语句:
update CUSTOMERS set NAME= ‘Mike’…… where ID=1;
其实第一次调用setName是无意义的,完全可以省略掉。
Session缓存在什么时候才清理呢?我们来看一下:
Session会在下面的时间点清理缓存:
1. 当应用程序调用org.hibernate.Transaction的commit()方法的时候,commit()方法先清理缓存,然后再向数据库提交事务。
2. 当应用程序显式调用Session的flush()方法的时候,其实这个方法我们几乎很少用到,因为我们一般都是在完成一个事务才去清理缓存,提交数据更改,这样我们直接提交事务就可以。
二级缓存:sessionFactory工厂级别
二级缓存插件EHCache的 jar 包及配置文件
在hibernate.cfg.xml文件中进行配置
<!-- 配置启用 hibernate 的二级缓存 --> <property name="cache.use_second_level_cache">true</property> <!-- 配置hibernate二级缓存使用的产品 --> <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property> <!-- 配置对哪些类使用 hibernate 的二级缓存 --> <class-cache usage="read-write" class="com.atguigu.hibernate.entities.Employee"/>
集合级别的二级缓存的配置
<collection-cache usage="read-write" collection="com.atguigu.hibernate.entities.Department.emps"/> <!-- 也可以在 .hbm.xml 文件中进行配置 --> <set name="emps" table="GG_EMPLOYEE" inverse="true" lazy="true"> <cache usage="read-write"/> <key> <column name="DEPT_ID" /> </key> <one-to-many class="com.atguigu.hibernate.entities.Employee" /> </set> <!-- 注意: 还需要配置集合中的元素对应的持久化类也使用二级缓存! 否则将会多出 n 条 SQL 语句. --> <class-cache usage="read-write" class="com.atguigu.hibernate.entities.Employee"/>
二级缓存的清除
1:调用evict()方法;
2:关闭SessionFacotry;