Hibernate的缓存机制

来源:互联网 发布:java jsonarray 编辑:程序博客网 时间:2024/05/16 18:32

Hibernate有俩种缓存形式,分别是一级缓存和二级缓存。通常客户端程序会先访问一级缓存,找不到相应内容再访问二级缓存。但是一级缓存是hibernate自动生成的通常不需要手动配置,而二级缓存需要开发人员手动配置。

 

1.     一级缓存:

Hibernate的一级缓存在session对象内部维护了一个MapMap的(keyvalue)分别对应pojo类实例化对象的(sid,对象的引用)。

当我们在hibernate程序中第一次插入或查询时,hibernate会自动将查询到的结果(持久化对象)存放在session的一级缓存里,当我们再次查询数据库的该内容时,hibernate会自动从一级缓存中取数据,而不再去与数据库进行交互,从而提高了数据访问效率。

值得关注的是session的生命周期,当前的事务一旦提交(调用transactioncommit ()方法),当前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查询,想使用二级缓存还需开启查询缓存功能 -->

      <propertyname="hibernate.cache.use_query_cache">true</property>

 

然后还需要在pojo类的映射文件里面进行如下配置:

<!--设置并发访问策略 -->

        <cacheusage="read-only"/>

我们可以选择适合并发访问策略(一般来说选择read-only即可)

 

 

 

最后我们还需要新建一个ehcache.xml文件,通常可以在hibernate下载包里找到一个附带的例子,这个是我的hibernate下载包里带的例子:

<ehcache>

    <diskStorepath="java.io.tmpdir"/>

   

    <defaultCache

        maxElementsInMemory="10000"

        eternal="false"

        timeToIdleSeconds="120"

        timeToLiveSeconds="120"

        overflowToDisk="true"

        />

    <cachename="pojo.Students"

        maxElementsInMemory="1000"

        eternal="false"

        timeToIdleSeconds="10"

        timeToLiveSeconds="120"

        overflowToDisk="true"

        /> -->

 

</ehcache>

 

最后还需要导包,将hibernate下载包里的ehcache.jar文件导入。

1 0
原创粉丝点击