缓存

通常我们认为,使用Hibernate性能不如直接写SQL,但这并不是说两个人一个使Hibernate,一个直接用JDBC,后者写的程序性能高。Hibernate是一个框架,提供了很多实用的功能,比如缓存机制能够有效提升持久层的性能。Hibernate缺点是毕竟程序不如人智能,自动生成的SQL可能有点傻。

Hibernate中,我们需要了解存在三种缓存的概念:

  • Session级别的一级缓存
  • 可选的SessionFactory级别的二级缓存
  • 查询缓存

一级缓存

一级缓存通常不需要开发者关心,它是默认开启的,所谓的Session级别的缓存,就是指在一个Session的有效期内,我们对持久化对象所做的一些操作可以被缓存,而不是直接写入数据库,除非中途调用了flush()方法(有时出于统计等目的可能必须要这么做)。

二级缓存

二级缓存是全局性质的,所有Session都可以共享二级缓存,抓取数据时,优先从二级缓存中抓取,如果二级缓存中没有再查询数据库。默认情况下二级缓存是关闭的。Hibernate的二级缓存需要使用第三方实现或是自己实现,这里我们可以使用ehcache。整合Hibernate和ehcache需要hibernate-ehcacheehcache包,它们不包含在hibernate-core里。

hibernate.cfg.xml

<!--开启二级缓存-->
<property name="cache.use_second_level_cache">true</property>
<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

除此之外,我们还需要在src下(maven结构是resources目录)建立一个ehcache.xml,用于对ehcache配置。

<?xml version="1.0" encoding='UTF-8'?>
<ehcache>
    <!--一般是/tmp目录-->
    <diskStore path="java.io.tmpdir"/>
    <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="true"
            diskPersistent="false"
    />
</ehcache>

查询缓存

一级、二级缓存都是对整个实体进行缓存,查询缓存可以对普通属性进行缓存。查询缓存的key是HQL或SQL语句,只有完全相同的HQL或SQL语句(包括参数)结果才会被缓存。注意:大部分情况下查询缓存并不能提高应用性能,应该慎重使用。只有经常使用相同的查询语句(包括参数),查询缓存才能有效利用,一条查询缓存的生命周期到属性被修改为止。

开启查询缓存

hibernate.cfg.xml

<!--开启查询缓存-->
<property name="cache.use_query_cache">true</property>

除此之外,还必须调用Query对象的setCacheable(true)才会对查询结果进行缓存。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap