编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

如何应用EhCache缓存框架提高软件应用系统持久层响应性能

wxchong 2024-08-19 23:42:30 开源技术 7 ℃ 0 评论

软件项目实训及课程设计指导——如何应用EhCache缓存框架提高软件应用系统持久层响应性能

1、在Web应用系统中应用持久层相关的缓存框架

在Java应用程序开发实现和J2EE Web应用系统的设计和开发实现中,软件应用系统的设计和开发实现人员可以在系统的表示层和系统的持久层中充分地应用缓存机制和相应实现技术能够大大地提高Web应用系统的访问性能。

比如数据库连接池、多线程应用中的线程池、对象复用池以及各种应用框架中的缓存插件,如Hibernate框架中常使用的二级缓存插件EHCache,分布式应用环境中的高速缓存系统MemCache,基于key-value(键/值对)远程字典服务的Redis以弥补MemCache等系统在key-value形式的存储应用中的不足。

因此,合理并有效地使用缓存技术能够优化软件应用系统中的数据访问性能,这特别是在基于Web方式的应用系统中由于要支持大并发的访问量,更应该要应用相关的缓存技术——有效地应用缓存技术可以减少Web服务器与数据库服务器之间的网络交互的次数,从而提高应用系统数据访问速度并减少等待时间。

作者在下文为读者介绍在J2EE应用系统中广泛应用的两个较流行的Java对象缓存框架Whirlycache和EhCache,考虑到本文的篇幅关系,作者重点介绍EhCache缓存框架。

2、在Web应用系统中应用whirlycache缓存框架

(1)Whirlycache是一个快速的、可配置的、存在于内存中的对象缓存

该缓存框架为开源项目,能够通过缓存对象来加快Web应用系统的请求响应的速度。读者可以在Whirlycache的官方网站(参看下图浏览器URL地址栏中所示的下载地址)下载Whirlycache有关的系统包文件。请见下图所示的系统包下载的页面内容的局部截图。

(2)熟悉和应用Whirlycache开源缓存项目

Whirlycache开源缓存项目需要开发人员在系统的Classpath路径中添加一个名称为whirlycache.xml的配置文件——如果开发人员没有提供该配置文件,Whirlycache系统将自动地应用whirlycache jar包文件中的whirlycache-default.xml文件中的缺省的配置项目。

另外,为了能够简化开发人员对使用Whirlycache开源缓存项目的配置工作,在Whirlycache开源缓存项目中为开发人员提供了一个模板的配置文件,只需要在该模板配置文件中进行局部地调整有关的配置项目就可以应用Whirlycache开源缓存系统。

如果读者需要了解和学习如何应用Whirlycache开源缓存系统,可以浏览Whirlycache的官方网站上提供的在线帮助文档说明。下图所示为Whirlycache的官方网站上提供的"Quick Start"的帮助内容的局部截图,从该页面中可以了解如何通过编程方式缓存应用系统中的对象的程序代码。

3、在Web应用系统中应用EhCache缓存框架

(1)Ehcache开源缓存系统

EhCache缓存具有运行速度快、结构简单、占用内存小以及很小的依赖性、并支持多CPU服务器等技术特性。在J2EE 平台中的O/R Mapping类型框架——Hibernate框架中将EhCache缓存作为一个插件被引入,并作为Hibernate框架的查询缓存的实现插件。

读者可以通过EhCache官方网站(参看如下示图所示的浏览器URL地址栏中的地址)获得EhCache相关的系统包文件及技术帮助文档。

(2)在Hibernate框架中使用EhCache开源缓存系统

在Hibernate框架中如果需要使用EhCache开源缓存项目,首先需要在hibernate.cfg.xml的配置文件中添加如下的设置项目:

<property name=" hibernate.cache.provider_class">
					org.hibernate.cache.EhCacheProvider
</property>

其次,EhCache缓存系统有它自己的配置文件——文件名称为ehcache.xml,在Hibernate框架的系统库中的etc目录下有一个ehcache.xml的模板配置文件,读者只需要将其复制到Web应用程序的WEB-INF/classes目录下、并对其中的相关项目进行更改以匹配自己的Web应用程序。如下示图为某个项目中的ehcache.xml模板配置文件代码示例。

4、在Hibernate框架的系统包中已经包含有Ehcache的系统库文件

读者可以按照如下示图所示的官方网站的网址进入Hibernate框架的官方网页,点击页面中的"Hibernate ORM"链接(参看如下示图所示的链接)。

然后将进入Hibernate框架的系统库下载的页面,参看如下示图所示。读者可以根据待开发的项目需要下载对应版本的Hibernate框架的系统库文件(一般是下载最新版本)。

5、在Web项目中应用Hibernate框架中的查询缓存

很多Hibernate框架的使用者在调用其相应方法时都迷信地相信"Hibernate框架会自行为我们处理性能的问题",或者"Hibernate会自动为我们的所有操作调用缓存"。实际的情况是Hibernate虽然为我们提供了很好的缓存机制和扩展缓存框架的支持,但是必须经过正确的调用,它才有可能发挥作用。

所以造成很多应用系统中使用Hibernate框架后出现了系统的性能问题,这实际上并不是Hibernate框架不行或者不好,而是因为使用者没有正确的了解其使用方法而造成的。因此,为了能够在Hibernate框架中正确地应用EhCache缓存系统从而实现Hibernate框架中的查询缓存,需要完成如下的系统配置定义。

(1)在hibernate.cfg.xml系统配置文件中进行相关的配置

为了启用查询缓存(Query Cache),开发人员需要在hibernate.cfg.xml文件中进行如下的配置,参考配置请参看如下代码示例中的黑体标识的代码或者参看如下示例图中的配置结果。

<hibernate-configuration>
      <session-factory>
            …………
            <property name="cache.use_query_cache"> true </property>
            <property  name="cache.provider_class">org.hibernate.cache.EhCacheProvider
            </property>
            …………
      </session-factory>
</hibernate-configuration>

该设置将会创建两个缓存区域:一个用于保存Hibernate返回的查询结果集(org.hibernate.cache.StandardQueryCache); 另一个则用于保存最近查询的一系列表的时间戳(org.hibernate.cache.UpdateTimestampsCache)。

但要注意的是,在查询缓存中,它并不缓存结果集中所包含的实体的确切状态;它只缓存这些实体的标识符属性的值、以及各值类型的结果。所以查询缓存通常会和二级缓存一起使用。如下示例图显示某个项目中启用了Hibernate框架的查询缓存后,在控制台中输出的状态提示信息。

但要注意的是,如果在Web应用系统项目中是使用Spring框架调用Hibernate框架的sessionFactory(会话工厂对象)方式时,则需要进行如下的设置定义(注意其中黑体标识的代码)。

<bean id="sessionFactory"
								class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
 <property name="dataSource"> <ref bean="datasource" /> </property>
 <property name="hibernateProperties">
   <props>
     <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
							<prop key="connection.provider_class">
													org.hibernate.connection.C3P0ConnectionProvider</prop>
    <prop key="hibernate.show_sql">true</prop>
    <prop key="hibernate.cache.use_query_cache">true</prop>
						 <prop key="hibernate.cache.provider_class">
													org.hibernate.cache.EhCacheProvider</prop>
   </props>
 </property>
 <property name="mappingDirectoryLocations">
   </list><value>/WEB-INF/classes/cn/rmic/manager/hibernate/<value> </list>
 </property>
</bean>

很多的Hibernate框架的使用者在配置到这一步就以为完事了,其实光这样配置,根本就没有使用Hibernate框架的二级缓存。同时因为在使用Hibernate框架时大多时候是马上关闭会话session。所以,Hibernate框架中的一级缓存也没有起到任何作用。结果就是没有使用任何的缓存,所有的Hibernate框架的操作都是直接操作物理数据库系统。

因此,正确的办法是除了以上的配置外,还应该配置每一个PO持久对象的具体缓存策略,在影射文件中增加配置对应的项目。

(2)在Hibernate框架的对象/关系映射文件中配置出对持久对象的具体缓存的应用策略

<class name="example.UserInfo" table="userInfo">
      <cache usage="read-only"/>
      ....
</class>

在上面的配置项目中的关键就是这个<cache usage="read-only"/>项目,其中的usage属性可以有如下的几个选择:read-only、read-write和transactional等。此外,在程序代码中只有通过调用query.iterate()方法时,Hibernate框架系统程序才会调用缓存中保存的数据。同时 get 和 load方法也都会查询在缓存中保存的数据。

(3)在Web项目中还需要配置与EhCache缓存系统相关的配置

为此,需要在Web项目中系统根目录中添加一个文件名称为ehcache.xml的XML格式的配置文件,操作过程可以参考如下示例图。

本示例所涉及的ehcache.xml配置文件的示例代码请参看如下代码示例,并注意其中黑体标识的代码或者参看如下示例图中的最终配置结果。

<?xml version="1.0" encoding="UTF-8" ?>
<ehcache>
    <diskStore path="java.io.tmpdir"/>
    <defaultCache maxElementsInMemory="10000" eternal="false"
   							 timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" />
    <cache name="org.hibernate.cache.StandardQueryCache"
    						maxElementsInMemory="50" eternal="false" timeToIdleSeconds="3600"
   						 timeToLiveSeconds="7200" overflowToDisk="true"/>
    <cache name="org.hibernate.cache.UpdateTimestampsCache"
   						 maxElementsInMemory="5000" eternal="true" overflowToDisk="true"/>
    <cache name="myCacheRegion" maxElementsInMemory="10" eternal="false"
    					timeToIdleSeconds="3600" timeToLiveSeconds="7200" overflowToDisk="true" />
</ehcache>

(4)在Web项目的DAO组件中将Query.Cacheable设置为true

绝大多数的查询并不能从查询缓存中受益,所以Hibernate框架默认是不进行查询缓存的。如果在Web应用系统项目中需要启用查询缓存,请调用 Query.setCacheable(true)方法。这个调用会让查询在执行过程中先从缓存中查找结果,并将自己的结果集放到缓存中以更新缓存。

因此,在Web应用系统程序中必须在查询执行之前,将Query.Cacheable属性设置为true,而且每次都应该要进行这样的设置。参看如下的代码示例或者参看如下示例图所示的代码:

Query oneQuery =session.createQuery(hql).setInteger(0.15);
oneQuery.setCacheable(true);

当然,也可以采用如下形式的代码:

oneQuery.setCacheable(true); //激活查询缓存
oneQuery.setCacheRegion("myCacheRegion"); //指定要使用的cacheRegion,可选

上面代码示例中的第二行指定要使用的cacheRegion是名称为myCacheRegion的配置定义(参看如下示例图所示),即开发人员可以给每个查询缓存做一个单独的配置——这样开发人员能够实现对查询缓存的失效策略进行精确的控制,通过调用Query.setCacheRegion()方法, 为每个查询指定其命名的缓存区域。

如果使用setCacheRegion方法来做这个指定,则需要在ehcache.xml文件中配置它(请见前面的配置示例)。如果省略第二行,不设置cacheRegion的话,那么会使用上面提到的标准查询缓存的配置,也就是org.hibernate.cache.StandardQueryCache;如果不存在与类名匹配的cache名称,则用defaultCache名称。

但要注意的问题是:当Hibernate框架更新数据库中的数据时,它怎么知道更新哪些查询缓存呢?

Hibernate框架会维护对每个数据库表的最后更新时间,这些更新时间其实也就是放在上面org.hibernate.cache.UpdateTimestampsCache所指定的缓存配置里面。

当通过Hibernate框架更新时,Hibernate框架会知道这次更新影响了哪些数据库表。然后它更新这些数据库表的最后更新时间。每个缓存都有一个生成时间和这个缓存所查询的数据库表,当Hibernate框架查询一个缓存是否存在时,如果此缓存存在,它还要取出缓存的生成时间和这个缓存所查询的数据库表,然后去查找这些数据库表的最后更新时间,如果有一个数据库表在生成时间后更新过了,那么这个缓存将是无效的。

因此,可以看出,Web应用系统只要更新过一个数据库表,那么凡是涉及到这个数据库表的查询缓存就失效了,因此查询缓存的命中率可能会比较低。

(5)在Hibernate框架的hibernate.cfg.xml系统配置文件中添加如下配置:<property name="log4j.logger.org.hibernate.cache">debug</property>

该配置项目的主要目的是在调试Web应用系统中的相关程序时能够使用Log4j日志处理系统输出调试相关的信息(等同于log4j.logger.org.hibernate.cache=debug),从而能够更方便地了解EhCache缓存系统的工作过程。

但这个配置定义项目主要用于对Web应用项目程序调试的过程,在Web应用系统正式发布时候,需要通过注释的方式除掉该配置项目,以免影响Web应用系统的性能。

如何应用OSCache缓存框架提高Web应用系统页面响应性能

如何应用Web页面静态化技术以提高Web应用系统的响应性能

课程设计指导——应用AJAX技术提高Web应用的整体响应性能

如何在J2EE平台开发基于Velocity模板的Web应用

如何在Web应用系统表示层开发中应用Velocity模板技术

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表