Hibernate有俩种缓存形式,分别是一级缓存和二级缓存。通常客户端程序会先访问一级缓存,找不到相应内容再访问二级缓存。但是一级缓存是hibernate自动生成的通常不需要手动配置,而二级缓存需要开发人员手动配置。
1. 一级缓存:
Hibernate的一级缓存在session对象内部维护了一个Map,Map的(key,value)分别对应pojo类实例化对象的(sid,对象的引用)。
当我们在hibernate程序中第一次插入或查询时,hibernate会自动将查询到的结果(持久化对象)存放在session的一级缓存里,当我们再次查询数据库的该内容时,hibernate会自动从一级缓存中取数据,而不再去与数据库进行交互,从而提高了数据访问效率。
值得关注的是session的生命周期,当前的事务一旦提交(调用transaction的commit ()方法),当前session就会关闭,此时session所维护的一级缓存也会被清除。
一级缓存可以保证缓存对象与数据库中相关记录的同步,若缓存对象的某些属性发生改变时(调用该对象属性的set方法),session不会立即执行相关的update语句,而在session调用commit()时将多条相关的更新语句合并为一条update语句。
2. 二级缓存
二级缓存是维护在SessionFactory里面,是可以被所有的程序共享(进程级别的缓存),二级缓存如果数据量过大,它还可以将数据存在磁盘上。二级缓存中存放的对象的散装数据(属性)。
Hibernate二级缓存需要我们手动配置。
首先在hibernate.cfg.xml添加以下代码:
<!--hibernate4.0配置二级缓存的实现 -->
<property name="hibernate.cache.region.factory_class"> org.hibernate.cache.cache.EhCacheRegionFactory</property>
<property name="hibernate.cache.use_second_level_cache">true</property>
<!--当使用query,criteria查询,想使用二级缓存还需开启查询缓存功能 -->
<property name="hibernate.cache.use_query_cache">true</property>
然后还需要在pojo类的映射文件里面进行如下配置:
<!--设置并发访问策略 -->
<cache usage="read-only"/>
我们可以选择适合并发访问策略(一般来说选择read-only即可)
最后我们还需要新建一个ehcache.xml文件,通常可以在hibernate下载包里找到一个附带的例子,这个是我的hibernate下载包里带的例子:
<ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
/>
<cache name="pojo.Students"
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="10"
timeToLiveSeconds="120"
overflowToDisk="true"
/> -->
</ehcache>
最后还需要导包,将hibernate下载包里的ehcache.jar文件导入。