Spring如何与Hibernate二级缓存集成?

日期: 2011-08-23 作者:Nirupa Katare翻译:杨华军 来源:TechTarget中国 英文

把二级缓存和基于Spring的应用集成到一起其实相当容易。让我们结合一个应用例子BuddyManagement来看看这一集成是如何进行的。   这里我们有一个BuddyManagementSample应用。该应用指定了一些组,这些组中存有一些联系人(或者叫伙伴)。

我们在这个应用里面指定了两个操作。一个用于获取一个组内的联系人数目,另一个则是获取组内的联系人清单的。应用有以下一些文件: Entity类:Contact.java and Groups.javaDAO 类:ContactsDAOImpl.javaService Impl 类:ContactsServiceFacadeImpl.jav……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

二级缓存和基于Spring应用集成到一起其实相当容易。让我们结合一个应用例子BuddyManagement来看看这一集成是如何进行的。

  这里我们有一个BuddyManagementSample应用。该应用指定了一些组,这些组中存有一些联系人(或者叫伙伴)。我们在这个应用里面指定了两个操作。一个用于获取一个组内的联系人数目,另一个则是获取组内的联系人清单的。应用有以下一些文件:

  • Entity类:Contact.java and Groups.java
  • DAO 类:ContactsDAOImpl.java
  • Service Impl 类:ContactsServiceFacadeImpl.java
  • Utility 类:BuddyMgmtUtils.java
  • 配置xml: Ehcache.xml , applicationContext.xml
  • Persistence Unit xml: persistence.xml
  • 库: Ehcache-1.5.0.jar及支持jar backport-util-concurrent-3.0.jar
  • 其他spring框架及保留java功能的支持库

  以下是将Ehcache二级缓存跟我们的应用集成起来的步骤过程:

  1. Ehcache实现需要其中的2个jar添加进代码中:

  Ehcache-1.5.0.jar

  下载位置:http://mirrors.ibiblio.org/pub/mirrors/maven2/net/sf/Ehcache/Ehcache/1.5.0/Ehcache-1.5.0.jar

  Ehcache-1.5.0 jar依赖于backport-util-concurrent-3.0.jar。因此我们还需要下列的jar。

  backport-util-concurrent-3.0.jar

  下载位置:http://mirrors.ibiblio.org/pub/mirrors/maven/backport-util-concurrent/jars/backport-util-concurrent-3.0.jar

  下面是BuddyManagement应用项目在Netbeans中的截图,图中jar已经被添加进库中。

BuddyManagement应用项目在Netbeans中的截图

  2.将缓存注解包含到所有实体中:

  缓存注解包含在所有即将被缓存的实体内。

  在主数据(Master Data,只读实体)实体中可用这一注解:

  例如. @Cache(usage=CacheConcurrencyStrategy.READ_ONLY)

  在交易实体(需要更新的实体)可用如下的注解:

  如.@Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)

  以下就是Groups.java实体的代码片段,此处我们已经将缓存该实体的@Cache注解添加了进来。类似的注解也已经被添加进其他需要用二级缓存Ehcache来进行缓存的实体当中。

Groups.java实体的代码片段

  3.将缓存注解包含进数据存取对象(DAO)类的扩展JpaDaoSupport:

  在DAO类中,可以为hibernate模板查询引入缓存,这一查询的缓存可通过属性“setHint”实现:

  例如:应如下使用该属性:query.setHint("org.hibernate.cacheable", true);

  BuddyManagementSample应用的ContactsDAOImpl.java类有一个名为fetchBuddyCountForGroup()的方法。该方法获取的是特定组用户的伙伴数量。我们有一个查询‘queryBuddyCountForUserId’方法,该方法获取的则是组中的伙伴数量。这一查询结果可通过以下查询属性得到queryBuddyCountForUserId.setHint(("org.hibernate.cacheable", true);

  以下是我们所引入查询缓存的DAO代码的样例片段

引入查询缓存的DAO代码的样例片段

  4.Ehcache.xml:

  在包含相关的jar并为了二级缓存对代码进行必要的修改之后,我们需要配置Hibernate来使用二级缓存。

  所有需要缓存的实体的配置及需要配置的缓存属性都放在一个名为‘Ehcache.xml’的xml文件中。

  Ehcache.xml被用于进行Ehcache区域的所有配置之中,并被直接放到类路径的根部。

  可以被配置到Ehcache.xml里面去的缓存属性是:

以下是引用片段:
<defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="1200"   timeToLiveSeconds="1200"     overflowToDisk="true" diskPersistent="false" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU"/>

  你还可以为列在xml文件里面的每一个实体指定‘maxElementsInMemory’属性。

  例如: <cache name="com.demo.entity.CommentsOnContent" maxElementsInMemory="10000"/>

  Ehcache.xml里面各种用到的属性参见以下描述:

  • maxInMemory—将会在内存中被创建出来的对象的最大数目
  • eternal—元素是否是持久的。如果是,timeouts将会被忽略,该元素则永不过期。
  • timeToIdleSeconds—设定一个元素在过期之前进入空闲状态的时间。设为0意味着该元素可不定期变为空闲状态。
  • timeToLiveSecond—设置一个元素过期前的活跃时间。
  • overflowToDisk—设置在内存缓存到达maxInMemory的限制时元素是否应该溢出到磁盘。

BuddyManagement应用

  BuddyManagement应用的Ehcache.xml文件如上所示。此处我们对其中两个实体进行了缓存—Contact和Groups。这些实体会被缓存并存储到服务器的临时目录上。其他属性也根据需要进行了配置。

  5.Persistence.xml:

  persistence.xml是集成Hibernate与应用所需的配置文件。当我们创建第一个实体且当前应用中已没有持久化单元的时候会产生该文件。在使能实体类为持久状态时需要用到持久化单元。

  Persistence.xml包含有预期是持久态的实体。为了激活二级缓存,我们还需要确保这些所需的缓存提供商的条目及配置资源的持久性。

  以下是需要添加进persistence.xml文件中的属性标签:

以下是引用片段:
             <properties>
             <property name="hibernate.cache.provider_class"  
              value="net.sf.Ehcache.hibernate.SingletonEhcacheProvider"/>
             <property name="net.sf.Ehcache.configurationResourceName" 
             value="/Ehcache.xml"/>
             <property name="hibernate.cache.use_query_cache" value="true"/>
             <property name="hibernate.cache.use_second_level_cache" value="true"/>
             <property name="hibernate.generate_statistics" value="true"/>
             </properties>
<properties>
             <property name="hibernate.cache.provider_class"  
              value="net.sf.Ehcache.hibernate.SingletonEhcacheProvider"/>
             <property name="net.sf.Ehcache.configurationResourceName" 
             value="/Ehcache.xml"/>
             <property name="hibernate.cache.use_query_cache" value="true"/>
             <property name="hibernate.cache.use_second_level_cache" value="true"/>
             <property name="hibernate.generate_statistics" value="true"/>
             </properties>

  对于任何的persistence.xml文件来说,‘hibernate.cache.provider_class’ 应当被指定为使用的供应商。此处我们提到了Ehcache的提供商。此外,"hibernate.cache.use_query_cache"属性需要被设为“true”。正如前面已经提到过那样,Query缓存应当在与二级缓存的结合中被用到。

  BuddyManagement应用使用的persistence.xml文件如下所示。实体Groups和Contacts都是持久化的,并被指定到xml当中。

实体Groups和Contacts都是持久化的,并被指定到xml当中。

相关推荐

  • 何为应用集成真正意义?

    企业实施移动应用集成(MAI)战略所面临最大的挑战是什么?启用MAI的关键技术和关键架构有哪些?

  • 也谈应用和云集成

    应用集成从1980年代中期就已经成为企业软件的痛点,也是那个时候我第一次开始做IT报道。同样的老问题让不同的软件共存,大部分是因为业主权益要比开放标准高。

  • 不同SaaS应用需新集成策略和工具的支持

    企业现在必须将本地应用与云应用完美地整合到一起吗?软件集成专家们向我们解释了传统集成方式失败和新工具、新策略奏效的原因。

  • 应用集成之路少不了荆棘

    如今企业正在为使用企业外部应用程序和服务实现内部信息整合寻找一条统一的方法,那么应用程序集成方法是否解决这一问题?