在开发中使用二级缓存
  RBCRsXsWXdIg 2023年11月02日 40 0


[code]

在开发中使用二级缓存

在这一部分中,将细致地介绍如何在Hibernate中使用二级缓存。在这里所使用的二级缓存组件为EHCache。

关于EHCache的详细信息请参考http://ehcache.sourceforge.net上的内容。

在Hibernate中使用二级缓存需要经历以下步骤:

● 在Hibernate配置文件(通常为hibernate.cfg.xml)中,设置二级缓存的提供者类。

● 配置EHCache的基本参数。

● 在需要进行缓存的实体对象的映射文件中配置缓存的策略。

下面就来逐步演示一下如何在开发中使用Hibernate的二级缓存。

修改Hibernate的配置文件

在使用Hibernate的二级缓存时,需要在Hibernate的配置文件中指定缓存提供者对象,以便于Hibernate可以通过其实现对数据的缓存处理。

在这里需要设置的参数是hibernate.cache.provider_class,在使用EHCache时,需要将其值设置为org.hibernate.cache.EhCacheProvider。具体要增加的配置如下所示:



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



Hibernate配置文件的详细内容请参考配套光盘中的hibernate"src"cn"hxex" hibernate"cache"hibernate.cfg.xml文件。

增加EHCache配置参数

在默认情况下,EHCache会到classpath所指定的路径中寻找ehcache.xml文件来作为EHCache的配置文件。

在配置文件中,包含了EHCache进行缓存管理时的一些基本的参数。具体的配置方法如清单14.9所示。

清单14.9 EHCache的配置

<?xml version="1.0" encoding="UTF-8"?> 


<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 


 xsi:noNamespaceSchemaLocation="ehcache.xsd"> 


 <diskStore path="java.io.tmpdir" /> 


 <defaultCache 


 maxElementsInMemory="10000" 


 eternal="false" 


 timeToIdleSeconds="120" 


 timeToLiveSeconds="120" 


 overflowToDisk="true" 


 diskPersistent="false" 


 diskExpiryThreadIntervalSeconds="120" 


 memoryStoreEvictionPolicy="LRU" /> 


</ehcache>


在这里只是使用EHCache所提供的默认配置文件进行了EHCache的基本配置,对于这些参数的详细含义请参考其官方网站(http: //ehcache.sourceforge.net/)中的资料。在实际的开发中,应该依据自己的具体情况来设置这些参数的值。

开发实体对象

这里所使用的是一个非常简单的User对象,它只包含了ID,name和age三个属性,具体的实现方法请参见配套光盘中的hibernate"src"cn"hxex"cache"User.java文件。

配置映射文件

映射文件的配置与不使用二级缓存的Java对象的区别就在于需要增加前面所介绍的<cache>元素来配置此对象的缓存策略。在这里所使用的缓存策略为“read-write”。所以,应该在映射文件中增加如下的配置:

<cache usage="read-write"/>



映射文件的详细配置请参考配套光盘中的hibernate"src"cn"hxex"cache"User.hbm.xml文件。

测试主程序

在这里的测试主程序采用了多线程的运行方式,以模拟在不同Session的情况下是否真的可以避免查询的重复进行。

在这个测试程序中,所做的工作就是依据ID来得到对应的实体对象,并将其输出。然后通过多次运行此程序,来检查后面的运行是否进行了数据库的操作。

测试主程序的主要测试方法的实现如清单14.10所示。

清单14.10 测试主程序的实现

…… 



public void run() { 


 SessionFactory sf = CacheMain.getSessionFactory(); 


 Session session = sf.getCurrentSession(); 



 session.beginTransaction(); 




 User user = (User)session.get( User.class, "1" ); 


 System.out.println( user ); 


 session.getTransaction().commit(); 


} 

 public static void main(String[] args) { 


 CacheMain main1 = new CacheMain(); 

 main1.start(); 

 CacheMain main2 = new CacheMain(); 

 main2.start(); 

 } 


}




运行测试程序

在运行测试程序之前,需要先手动地向数据库中增加一条记录。该记录的ID值为1,可以采用下面的SQL语句。

INSERT INTO userinfo(userId, name, age) VALUES( '1', 'galaxy', 32 );

接下来在运行测试主程序时,应该看到类似下面的输出:

Hibernate: select user0_.userId as userId0_0_, user0_.name as name0_0_, user0_.age as age0_0_ from USERINFO user0_ where user0_.userId=?

ID: 1

Namge: galaxy

Age: 32

ID: 1

Namge: galaxy

Age: 32

通过上面的结果可以看到,每个运行的进程都输出了User对象的信息,但在运行中只进行了一次数据库读取操作,这说明第二次User对象的获得是从缓存中抓取的,而没有进行数据库的查询操作。

[/code]

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
RBCRsXsWXdIg