Hibernate二级缓存

原创 2017年11月14日 17:46:04

Hibernate是一个很好的ORM,对于性能优化也提供了很多方案。其中缓存方案中有一级缓存(默认开启),二级缓存(默认关闭)。在我参与项目中开启了二级缓存,这是一个老项目,可是感觉没有很好的效果,于是就学习了hibernate的二级缓存,尝试解决问题。对于二级缓存的选择应当是根据自己的需求选择是否开启,开启到何种程度。
项目相关信息:

hibernate版本:4.3.8.Final
数据库:mysql 5.7.18

主要的缓存

  • EHCache:快速、轻量级、易用的线程内缓存。支持只读、读写缓存。支持内存,磁盘缓存。但不支持集群。
  • OSCache:一个大型解决方案的一部分,提供对jsp页面和任何对象的缓存,强大而又灵活。也支持只读,读写缓存,支持内存、磁盘缓存。同时提供基于JavaGroups or JMS的基础集群支持。
  • SwarmCache:提供基于JavaGroups的简单集群支持。支持只读、非严格读写。适合读远远多于写的应用。
  • JBoss TreeCache:提供了强大的同步以及事务缓存。如果需要一个具有事务能力的高速缓存架构,这将是一个很好的选择。当然,也支持集群。

缓存策略

  • Read-only: 这种策略适合一直读但不更新的情况,性能是最好的。
  • Read/write: 这种策略适合需要修改数据的情况,不过需要更多的性能消耗。
  • Nonstrict read/write: 这种策略不保证两个事务不会同时修改相同数据。适合大多时候读,极少需要修改。
  • Transactional: 仅能在JTA环境中使用的完全事务

重要的配置

<property name="hibernateProperties">
    <props>
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
        <prop key="hibernate.show_sql">true</prop>
        <prop key="hibernate.format_sql">true</prop>
        <prop key="hibernate.hbm2ddl.auto">update</prop>
        <prop key="hibernate.cache.use_second_level_cache">true</prop>
        <prop key="hibernate.cache.use_query_cache">true</prop>
        <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
        <prop key="hibernate.cache.provider_configuration_file_resource_path">ehcache.xml</prop>
    </props>
</property>

 

hibernate.cache.use_second_level_cache:开启二级缓存

hibernate.cache.use_query_cache:开启查询缓存

hibernate.cache.region.factory_class:缓存区实现类

hibernate.cache.provider_configuration_file_resource_path:缓存配置文件

defaultCache
        maxElementsInMemory="1000"
        eternal="false"
        timeToIdleSeconds="120"
        timeToLiveSeconds="120"
        maxElementsOnDisk="1000000"
        overflowToDisk="true"
        memoryStoreEvictionPolicy="LRU">

</defaultCache>

maxElementsInMemory:内存中最大保存实体数

Eternal:是否永久保存

timeToIdleSeconds:缓存对象在多少秒内没有被使用就清除

timeToLiveSeconds:缓存对象在过期前可以缓存多少秒

maxElementsOnDisk:磁盘中最大保存实体数

overflowToDisk:系统宕机时是否保存到磁盘上

memoryStoreEvictionPolicy:清除对象的方式

二级缓存的开启

①开启二级缓存。

二级缓存默认是关闭的,开启需要在配置文件中手动添加:

<prop key="hibernate.cache.use_second_level_cache">true</prop>

除此,还需要对需要缓存的实体添加cache注解,注解如下:

@Entity
@Table(name = "user", schema = "", catalog = "")
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
public class UserEntity {
......
}

至此,当使用listgetload等时,获取的数据会添加到二级缓存中。

但是,只有使用loadget时才会使用二级缓存中的数据。因为这个时候二级缓存中仅仅使用entity的标识属性作为key来缓存实体。

List、条件查询都会直接从数据库中获取数据。(未开启条件查询时)

②开启查询缓存

查询缓存默认关闭,打开方式如下:

<prop key="hibernate.cache.use_query_cache">true</prop>

对于需要缓存查询语句需要添加”setCacheable(true)”

<prop key="hibernate.cache.use_query_cache">true</prop>

将会以本条sql语句作为key,如果查询语句中有参数,将会由参数组装成sql语句作为key

select
    this_.id as id1_2_0_,
    this_.name as name2_2_0_,
    this_.version as version3_2_0_
from
    test.user this_
where
    this_.id='0b0ee7bb-8fba-4f87-91c4-db69f249fcc4'

当下一次查询语句组装的sql语句于缓存的key一致时(相同的语句,相同的参数),才会使用二级缓存中的数据。

缓存中数据的添加更新删除

1,添加

对于对象的添加,listgetloadhqlsql获得的数据,都会以对象的标识属性为key进行缓存。

如果开启查询缓存,listhqlsql会进行两项缓存:①以对象的标识属性为key进行缓存;②以查询语句与参数组成的sql语句为key进行查询结果缓存。

2,删除与更新

①Read-only 

不能更新删除从缓存中获取的对象。

通过hql、sql等直接修改删除的,会清除该实体类的所有entity,以及相关查询缓存。

②其他

Updatedelete数据时,如果数据是从缓存中读取的或依据对象标识属性从数据库读取的(即要修改的属性是以标识属性从缓存或数据库中获取),再做修改,仅清除该实体,以及相关的查询缓存。

如果通过hqlsqlupdatedelete,则清除实体类的所有entity,以及相关的查询缓存。

 参考:

http://www.devx.com/dbzone/Article/29685?pf=true

http://www.iteye.com/topic/18904 

版权声明:本文为博主原创文章,未经博主允许不得转载。

这是我看过最好的对hibernate的二级缓存解析

很多人对二级缓存都不太了解,或者是有错误的认识,我一直想写一篇文章介绍一下hibernate的二级缓存的,今天终于忍不住了。  我的经验主要来自hibernate2.1版本,基本原理和3.0、3.1...
  • ice_grey
  • ice_grey
  • 2015年07月14日 12:35
  • 874

详解Hibernate中的二级缓存

1.前言 这篇博客再前几篇博客的基础上来讲解一下,Hibernate中的二级缓存,二级缓存是属于SessionFactory级别的缓存机制。第一级别的缓存是Session级别的缓存,是属于事务范围的...
  • ZHOUCHAOQIANG
  • ZHOUCHAOQIANG
  • 2015年08月18日 13:58
  • 19031

hibernate二级缓存配置和启动

首先说明一下,hibernate3和hiernate4配置是完全不一样的。 如果使用3: 1.下载:ehcache.jar,commons-logging.jar,ehcache.xml,然后在h...
  • carl_jiang
  • carl_jiang
  • 2016年11月19日 15:42
  • 1076

hibernate4 二级缓存demo实例

转自:http://cxl2012.iteye.com/blog/1944489#comments 配置一目了然 hibernate使用版本是:hibernate-release-4.2....
  • stan503
  • stan503
  • 2013年12月02日 21:46
  • 1421

Hibernate 二级缓存的作用

使用缓存,是需要对应用系统进行性能优化而常采用的一种重要手段。合理地运用缓存,可以极大的提高应用系统的运行效率。 Hibernate中应用缓存:因为应用程序访问数据库,读写数据的代价非常高,而利用持久...
  • AlvinTech14
  • AlvinTech14
  • 2014年09月09日 15:53
  • 925

Hibernate一级缓存和二级缓存详解

一、一级缓存二级缓存的概念解释 (1)一级缓存就是Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中,如果短时间内这个 session(一定要同一个ses...
  • u010870518
  • u010870518
  • 2014年10月14日 09:02
  • 17049

hibernate二级缓存个人理解勿喷

首先我们先理解什么是二级缓存? 他是sessionFactory级别的缓存,sessionFactory在一个项目中是唯一的,他可以缓存业务数据,实现其他用户的共享. 那么他和session一起缓...
  • ytblght55
  • ytblght55
  • 2016年01月06日 20:27
  • 1085

hibernate进二阶之理解二级缓存

Hibernate提供了基于应用程序级别(进程)的缓存, 可以跨多个session,即不同的session都可以访问缓存数据。 这个换存也叫二级缓存。 Hibernate提供的二级缓存有默认的实现...
  • Tomsheng321
  • Tomsheng321
  • 2017年02月01日 17:13
  • 867

Hibernate二级缓存提升性能(注解方式)

合理的缓存应用可以极大地提高系统性能
  • jrn1012
  • jrn1012
  • 2014年09月22日 21:07
  • 1638

Hibernate注解方式的二级缓存

hibernate默认情况下是支持一级缓存,也就是session级的缓存的,而默认情况下是不支持二级缓存,即sessionFactory级的缓存的,二级缓存        一般比较少去考虑它,除非对效...
  • elim168
  • elim168
  • 2014年10月28日 09:12
  • 9170
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hibernate二级缓存
举报原因:
原因补充:

(最多只允许输入30个字)