admin 管理员组

文章数量: 1086019


2024年3月28日发(作者:delphi二维数组)

维普资讯

第29卷 

第7期 

计算机工程与设计 

2008年4月 

Vo1.29 

NO.7 

Computer Engineering and Design 

apr.2008 

Hibernate性能优化研究 

顾丽红, 周 涛 

(中国石油大学(华东)计算机与通信工程学院,山东东营257061) 

摘要:Hib锄ate是连接Java对象模型和关系数据库模型的桥梁。在数据库操作频繁的系统中,良好的缓存管理策略和合理 

的连接池应用模式往往是性能提升的关键。对H emate的二级缓存机制和连接池策略进行较为详细地分析,把其配置到具 

体的应用中,并量化分析性能的提高。 

关键词:数据持久层;数据持久化工具;二级缓存;连接池;性能优化 

中图法分类号:TP302 文献标识码:A 文章编号:1000—7024(2008)07—1739—03 

Research on performance optimization of Hibernate 

GU Li.hong. ZHOU Tao 

(College ofComputer and Communication Engineering,China University ofPetroleum,Dongying 257061,China) 

Abstract:Hibernate is the bridge ofthe Java object model and the relationship database mode1.Favorable Cache strategy and reasonable 

application model connection pool is the key to optimize hte system performance in frequent database operation.Firstly,the particular 

analysis ofthe second level cache mechanism and hte strategy of connection pool rae given,then the configuration in hte specific appli— 

cation is presented,and ifnally hte performance improvement in quantity is analyzed. 

Key words:date persistence;Hibernate;second—level cache;connection pool;performance optimization 

0引 言 

数据表的映射、类间关系与键值的映射。常见的O/RMapping 

方案有:Top Link(商业性)、iBatis、Hibernate等。 

Hibernate作为目前O/RMapping领域中最受欢迎的数据持 

1.2 Hibernate 

久化工具,已经被越来越多的人应用到实际项目开发中。然而 

Hibernate是一个面向Java环境的O/R Mapping数据库映 

目前学术界对数据持久层的性能分析还没有系统的量化研究。 射工具。Hibenrate不仅仅管理Java类到数据库表的映射,还 

通过性能测试工具,在特定的测试实例中定量地分析每种性能 提供数据查询和获取数据的方法,可大幅度减少开发时人工 

优化措施对于数据持久层性能的提升效果,对于将Hibernate技 使用sQL和JDBC处理数据的时间,而只是对对象进行操作。 

术应用于实际项目开发中有良好的理论指导和参考价值。 Hibenrate本质还是包装了JDBC来进行数据库操作的,是 

1 o/R Mapping及Hibernate简介 

对JDBC最高效的调用“ 。Hibernate是轻量级的封装,避免过 

多复杂的功能,减轻程序员的负担。同时,它也是一个开源的 

1.1 O/RMapping 

中间件,提供开放的API,用户可以自行扩充其功能。Hibenrate 

O/R Mapping的核心思想就是将关系数据库中表的字段 

在大多数主流的J2EE应用服务器的受管理环境中都可以良 

作为对象型数据中的属性,将字段和属性一~映射,同时将数 好运作,也可以作为独立应用程序运行。Hibenrate的体系结 

据库中表的关系映射为对象之间的关系。它一般位于系统的 构如图1所示。 

数据库层和应用层之问,将应用层的对象型数据解析成关系 

在Java中使用Hibernate包含以下步骤:创建Hibenrate的 

型数据发送到数据库,同时将数据库返回的关系型数据封装 

配置文件、创建持久化类、创建对象~关系映射文件、通过Hi— 

成对象型数据再传到应用层。O/RMapping具有自我存储到 

bernateAPI编写访问数据库的代码。 

关系数据库的能力,对对象的改变能够直接存储,而不考虑数 

据库存取代码。O/R Mapping使开发人员专心实现业务逻辑 

2影响数据持久层性能的因素及相应的优化措施 

而不用分心于繁琐的数据库方面的逻辑。 

2.1影响数据持久层性能的因素主要包括 

O/R Mapping主要包括:类属性与数据表列的映射、类与 (1)由于J2EE是多层的分布式架构,所以层次问大量的数 

收稿日期:2007—05—22 E-ma ̄:tone—tone2001@163.com 

基金项目:国家863高技术研究发展计划基金项目(2006AA010201)。 

作者简介:顾丽红(197O一),女,辽宁义县人,硕士,讲师,研究方向为分布式系统、嵌入式系统; 周涛(1982一),男,山东东营人,硕士研 

究生,研究方向为分布式系统。 

-——

1739-—— 

维普资讯

[二 ] 

图1 Hibernate体系结构 

据通信是影响性能的主要因素。 

(2)频繁的建立、关闭连接,会极大地减低系统的性能,因 

此对于连接的使用往往会成为系统性能的瓶颈。 

(3)相对于内存操作而言,数据库调用是一个代价高昂的 

过程,在典型企业级应用结构中,数据库往往与应用服务器位 

于不同的物理服务器,这也就意味着每次数据库访问都是一 

次远程调用,Socket的创建与销毁,数据的打包拆包,数据库 

执行查询指令及网络传输上的延时,这些消耗都给系统整体 

性能造成了严重影响。 

2.2利用缓存技术提高Hibernate性能 

缓存是提高基于Hibernate数据持久层性能的关键因素。 

缓存经常被用于优化数据库的性能。缓存是通过提前把数据 

库中的数据保存起来,来降低应用与数据库之间通信量的。数 

据持久层采用缓存技术来保存已经从数据库中检索出来的部 

分常用数据。客户端访问持久层时,持久层将首先访问缓存, 

如果能够命中则直接从缓存中提取数据,否则再向数据库发 

送提取数据的指令 。这种设计能够大幅度地提高数据访问 

速度。Hibernate提供了两级缓存,如图2所示。 

图2 Hibernate二级缓存 

第一级缓存是Session缓存。由于Session对象的生命周 

期通常对应一个数据库事务或者一个应用事务,因此它的缓 

存是事务范围的缓存。第一级缓存是必要的,不允许而且事 

实上也无法被卸载。在第一级缓存中,持久化类的每个实例 

都具有惟一的OID。 

第二级缓存是一个可插拔的缓存插件,它有SessionFac. 

tory负责管理。由于SessionFactory对象的生命周期和应用程 

序的整个进程对应,因此第二级缓存是进程范围或集群范围 

的缓存 。这个缓存中存放的是对象的散装数据。缓存适配 

器用于具体的缓存实现软件与Hibernate集成。第二级缓存是 

可选的,可以在每个类或每个集合的粒度上配置第二级缓存。 

Hibernate还为查询结果提供了一个查询缓存,它依赖于 

第二级缓存。对于经常使用的查询语句,如果启用了查询缓 

1740一 

存Ⅲ,当第一次执行查询语句时,Hibernate会把查询结果存放 

在第二级缓存中。以后再次执行该查询语句时,只需从缓存 

中获得查询结果,从而提高查询性能。Hibernate中内置了4种 

数据并发策略,代表了数据库的隔离级别,分别是: 

(1)事务型:仅仅在受管理环境中适用。 

(2)读写型:提供了Read Committed事务隔离级别。仅仅 

在非集群的环境中适用。 

(3)非严格读写型:不保证缓存与数据库中数据的一致性。 

(4)只读型:对于从来不会修改的数据,如参考数据,可以 

使用这种并发访问策略。 

2.3利用连接池技术提高Hibernate性能 

应用程序连接数据库的时候,每一次连接数据库都要建 

立一个连接,用完后再释放。如果频繁的数据库操作,就会导 

致性能很低 。连接池的出现,为开发过程提供了一个很好的 

管理平台。对于使用了Hibenrate的Java应用,Hibenrate对 

JDBC API进行了封装,Java应用可以完全通过Hibernate API 

来访问数据库。Java应用不会直接访问数据库连接池,而是 

由Hibernate负责访问数据库连接池。Hibenrate通过以下几种 

方式获得连接池: 

(1)使用默认的数据库连接池。Hibernate提供了默认的连 

接池实现,它的实现类为DriverManagerCormectionProvider,如 

果在Hibernate的配置文件中没有明确配置任何连接池,Hiber- 

nate就会使用这个默认的连接池。 

(2)使用配制文件指定的数据库连接池。在受管理环境或 

者不受管理环境中,都可以在配置文件中显式配置特定数据 

库连接池 。Hibernate会负责构建这种连接池的实例,然后通 

过它获得数据库连接。Hibernate目前支持的第三方连接池产 

品包括:C3P0、Proxool和DBCP。 

(3)在受管理环境中,从容器中获得标准的数据源。在受 

管理环境中,容器负责构造数据源,即javax.sq1 DataSource的 

实例,然后把它发布到JNDI资源,Hibenrate的DataSource. 

ConnectionProvider类充当这个数据源的代理。在不受管理环 

境中,有些Servlet容器,如Tomcat,也能负责构造数据源,并能 

发它发布为JNDI资源,因此Hibernate也能从Tomcat容器中 

获得数据源。 

值得注意的是,不管Hibernate按何种方式获得数据库连 

接,对Java应用都是透明的。当改变Hibernate获取数据库连 

接池的方式时,只需修改Hibernate的配置文件,而不需要修改 

Java应用的程序代码。 

2.4其它性能优化措施 

除了利用上述缓存和连接池技术来优化Hibernate的性能 

外,常见的性能优化措施还有: 

(1)在允许的情况下,选用最新版本的Hibernate发布版。 

Hibernate3提供了一些有助于性能提高的新特征,如经过优化 

的批量处理机制、代理机制、属性的延迟加载支持等。 

(2)采用合理的Session管理机制。通过Thread级的Session 

重用,可以通过利用一级缓存中的已有数据,避免无谓的数据 

库访问开销和临时对象的反复创建,在系统中考虑追加这项 

特性,或根据情况制定符合实际情况的Session管理策略,可 

以提高持久层的性能 。 

维普资讯

(3)尽量使用延迟加载特征。对于无需立即加载的数据, 

3.3测试结果及分析 

应通过延迟加载特性延迟加载,以避免系统资源的无谓消耗。 

为了确保测试效果的真实性,每次访问数据库的平均时 

得注意的是,对于基于Hibernate实现的持久层,其性能表 

问都经过10次测试,最后取其平均值。 

现取决于多个方面的综合因素。其中,数据库本身的优化也 (1)如表1所示,为更新频率不高的Country表配置Read. 

起着举足轻重的作用,合理的索引、缓存与数据分区策略都会 

Only二级缓存,可以明显的提高数据持久层的性能。在Country 

对持久层性能带来可观的提升。 表的查询过程中,使用了二级缓存以后,除了第一次查询时问 

3性能测试 

变化不大以外,其它的查询性能提高了近6倍。 

3.1测试环境 

表1查询单个数据表的平均时间 

系统平台:联想启天M4600/Pentium4 2.93GCPU/512内存 

查询单一数据库表 未

平均时间/ms 

操作系统:WindowsXP SP2 

配置缓存 配置缓存 

1 493.8 506.2 

数据库服务器:MySQL5.0.18 

2 356.2 53 

测试工具:Junit 

3 306 46.8 

开发环境:Myeclipse+Sun JDK 1.5.0 

4 287.8 50 

所用插件:Ehcache、C3P0 

5 253 40.6 

3.2测试步骤 

注:Country表缓存中的参数配置为:maxElementslnIVlemory=”300” 

本文的主要对比方法是使用二级缓存和不使用二级缓存 

两种情况,其中对每种情况测试都进行单表查询(Country类) 

(2)如表2所示,为更新频率较高的Employee表配置Read/ 

和多表查询(Employee类)两种查询操作。利用4个简单的表 

Write二级缓存策略,可以明显的提高数据持久层的性能。在 

来测试缓存和连接池的使用,分别是:飞机场、员工、国籍以及 

Employee表中存在着N+1查询问题,即对于Employee表中的 

所说语言。UML图如图3所示。 

每个employee对象查询的过程中,伴随着对Language表的上 

百次的查询。因此在为Language类配置Read/Write缓存后, 

整个数据库查询时问缩短了2/3。 

表2查询多个数据库表的平均时间 

查询多个数据库表 平均时间/ms 

未配置缓存 配置缓存 

1 797.2 803 

2 215.6 201 

3 177.8 87.4 

4 175.2 68.6 

5 175 37.6 

注:Employee表缓存中的参数配置为:maxElementsInMemory=”5000” 

图3测试用例UML图 

具体的测试步骤如下: 

(3)如表l、表2所示,配置二级缓存后的第一次查询性能 

没有提高反而有所下降。分析其原因是配置二级缓存后,由 

(1)在Mysql数据库中按照要求建立字段,为了显示缓存 

于对二级缓存的初始化,耗费一定时问,使得性能略微下降; 

效果,为每个字段都插入大量的数据。 

第一次访问数据库的时问要远远大于以后访问的时问。其 

(2)按照Hibemate的使用步骤,为数据库中的每个字段生 

原因是第一次查询数据库时,连接数据库、加载数据消耗大 

成POJO类、 .hbm.xml映射文件及 .DAO文件。 

量的时间。 

(3)编写测试文件CountyrTest.java来查找Country表中所 

有的信息。Employee表与Language表存在一个多对多关联, 

(4)如表3所示,为应用配置连接池后,第一访问数据库的 

为多表查询。编写测试文件EmployeeTest.java来查找特定国 

效率提高了近20%,优化了第一次访问数据库的效率。 

籍的员工信息。为了体现出缓存的性能,在每次单元测试中 

表3配置连接池前后查询数据库 ̄.-IN 

模拟多次连续的数据库查询。运行测试程序,记录查询数据 

库的时间。 

(4)针对Country表、Employee表中数据量和更新频率的不 

同,分别为其配置Read-Only和Read/Write二级缓存策略,并 

注:连接池中主要的参数配置为:min size:5,max size:10,timeout:300ms 

为关联表Language表配置Read/Write缓存。运行测试程序, 

记录配置缓存后查询数据库的时间。 

4结束语 

(5)在hibemate.cfg.xml文件中配置C3P0连接池,测试配 

Hibemate是一个功能强大,可以有效地进行数据库数据 

置连接池后查询数据库的时间。 

(下转第1744页) 

-——

1741-—— 

维普资讯

之一。基于MVC模式的多层开发模型对复杂的Web应用系 

统开发是较为理想的系统构建方式。传统的Web应用开发技 

采用的技术不一致,设计的数据库也不一致,导致了功能模块 

的重复开发,系统数据不能共享,一定程度上在各子系统间就 

产生了“信息孤岛”。考虑到涪陵三农信息系统开发和涪陵的 

术,如ASP、JSP等都是将显示和代码集成在一起,在页面中同 

时实现显示、业务逻辑和流程控制,难以实现代码的重用。这 

三农信息化建设是一个长期的持续过程,根据研究计划,还有 

如农业医疗、农业教育等其它一系列的子系统有待开发,因此 

决定采用本文提出的基于SOA和MVC整合的模式来改造现 

样就造成了“牵一发而动全身”,Web应用系统的修改、更新和 

维护上的困难。为此采用MVC模式来进行Web应用系统的 

多层实现,在Model层调用服务,实现了将系统的表现界面、 

业务逻辑与数据分离,这样便于开发人员进行合理的分工,充 

有系统和开发新的系统。在实施过程中发现,很好地解决了 

系统建设中的资源重用问题、互连互通问题,降低了开发难度 

和开发成本,提高了开发质量和开发效率,更由于采用了MVC 

的开发模式,系统的表现界面、控制、业务逻辑与数据分离,由 

不同的专业人员实现,这样就减轻了工作负担,使他们能够集 

中注意力于自己负责的部分,更加专业化,降低了开发难度, 

开发出来的系统也更好。这种模式不仅可适应于三农信息系 

统建设,而且也可适用于其它领域的系统建设。 

分发挥他们的长处,提高开发效率和质量,同时在进行修改和 

维护时,只对对应层次上的业务逻辑重新调整组合,对其它层 

没有影响,这样系统的更新和维护也就变得容易多了。 

4实现技术 

4.1 SOA的实现 

SOA是一种不受限于具体技术的体系结构,定位于特定 

技术的集合如Web服务、RlVlI、COM、CORBA等之上 。从广 

义角度来说,可以被上述任意一种具体技术来实现。从严格 

意义上讲,只能由符合协议中立的技术去实现。相比以前的 

分布式计算技术,Web服务技术具有更好的可靠性、扩展性、 

易用性且具有协议开放性。虽然Web服务并非是实现SOA 

的必需组件,如果没有Web服务,企业照样也可以很好地实现 

SOA。而且部署了Web服务也并非意味实现了SOA。但由于 

它所具有的上述优势使其在实现SOA时具有重要地位,在实 

践过程中往往被优先考虑为实现SOA的技术而得到采用 。 

参考文献: 

[11 ]何蕾.基于RSA实现面向服务的体系架构[EB/0L].http://www. 

ibm.corn/developerworks/cn/mtional/r-rsa-soaJ,2005—08—22. 

[2 2]叶宇风.基于SOA的企业应用集成研究[J].微电子学与计算 

机,2006,23(5):211—212. 

[3 3]孙卫琴.基于MVC的Java Web设计开发[M】.北京:电子工业 

出版社,2006. 

[4] 张丽君,齐建卓,吴宏波 基于MVC模式的Struts框架在Web 

系统开发中的应用[J].内蒙古大学学报(自然科学版),2005,36 

(1):89—90. 

4.2 MVC的实现 

符合MVC设计模式的开发方法比较多,开发Web Appli— 

cation时,当前最为流行的实现技术是ASENET、J2EE 。用 

J2EE开发Web Application时,Struts是一个优秀的实现MVC 

的Java Web开发框架,是Apache项目之一,现在己经在Java 

开发团体中得到了广泛的支持和使用 。 

[5] 魏东.基于SOA体系结构软件开发的研究与实现[D].西安:西 

北大学计算机科学系,2005. 

[6] Kishore Channabasavaiah,Kerrie Holley,Edward M Tuggle Jr. 

迁移到面向服务的体系结构[EB/OL].http://www ibm.corn/de— 

veloperworks/cn/webservices/ws—migratesoa/,2003—12—01. 

5结束语 

在《涪陵三农信息系统开发》研究项目中项目组实现了涪 

陵三农信息系统,由3个子系统构成:农情信息系统、农业经 

济信息系统、农业技术服务系统,最先由3个小组分别开发, 

(上接第1741页) 

到业务对象的O/R Mapping方案。缓存是一项很有用的技 

术,Hibernate提供了一个强大的、可伸展的方式来配置缓存。 

[7] 陈思,郑声恩,叶少珍..NET架构下结合MVC设计模式的招 

标系统的设计与实现[J].福州大学学报(自然科学版),2006,34 

(4):501—504. 

[8] 吴寅斐,何钦铭,吴大瑞.Struts分析及其应用研究[J]。计算机工 

程,2006,31(16):44—45. 

蔡雪焘.Hibenarte开发及整合应用大全[M】.北京:清华大学出 

版社,2006. 

默认的缓存配置都会为一些简单事例带来好的性能。像所 

有的功能强大的工具一样,为了得到最佳的性能 ,在使用 

Hibernate的过程中需要不断的思考与测试。当使用恰当时, 

董洪杉,窦延平.利用Hibernate的J2EE数据持久层的解决方 

案[J].计算机工程,2004,30(z1):17—19. 

Hibernate的缓存机制介绍[0L].www.soft180.com/article. 

田珂,谢世波,方马.J2EE数据持久层的解决方案[J].计算机工 

程,2003,29(22):93—95. 

刘艳霞.J2EE项目中的数据持久层设计[J].工程地质计算机应 

用,2005,10:32—34. 

系列的缓存和连接池会带来良好的性能。要提高数据持 

久层的运行效率,必须从数据库系统级优化、数据库设计级 

优化以及数据持久层的具体实现级优化,这3个层次上同时 

下功夫。 

参考文献: 

[】] 孙卫琴.精通Hibernate:Java对象持久化技术详解[M].北京:电 

子工业出版社 2005. 

_——

林寒超,张南平.Hibernate技术的研究[J]_计算机技术与发展, 

2006,14(11):46—48. 一 

Speed up your hibernate applications with second一/eve/caching 

[EB/OL].http://www.devx.com/dbzone/Article/29685/1763. 

1744-—— 


本文标签: 数据库 数据 缓存