Hibernate是对JDBC的轻量级封装,因此在很多情况下Hibernate的性能比直接使用JDBC存取数据库要低。然而,通过正确的方法和策略,在使用Hibernate的时候还是可以非常接近直接使用JDBC时的效率的,并且,在有些情况下还有可能高于使用JDBC时的执行效率。
在进行Hibernate性能优化时,需要从以下几个方面进行考虑:
数据库设计调整。
HQL优化。
API的正确使用(如根据不同的业务类型选用不同的集合及查询API)。
主配置参数(日志、查询缓存、fetch_size、batch_size等)。
映射文件优化(ID生成策略、二级缓存、延迟加载、关联优化)。
一级缓存的管理。
针对二级缓存,还有许多特有的策略。
事务控制策略。
数据的查询性能往往是影响一个应用系统性能的主要因素。对查询性能的影响会涉及到系统软件开发的各个阶段,例如,良好的设计、正确的查询方法、适当的缓存都有利于系统性能的提升。
系统性能的提升设计到系统中的各个方面,是一个相互平衡的过程,需要在应用的各个阶段都要考虑。并且在开发、运行的过程中要不断地调整和优化才能逐步提升系统的性能。
设计阶段的考虑问题
一个良好的数据库结构有利于系统性能的提升。这里所说的良好结构的数据库并不单纯是指满足数据库设计范式的数据库结构。这是因为,按照数据库范式所设计的数据库只能说在结构上是最优的,没有冗余数据等问题,但在生产过程中并不一定能获得最佳的性能。有时候适当地增加一些数据的冗余虽然增加了数据维护的难度,但可以极大地简化业务的查询,提高数据检索的效率。
在使用Java访问数据库的时候,还存在另外一个问题,就是面向对象的Java语言与关系型数据库之间的矛盾。在这两者之间必然要涉及到一个相互转化的问题,对于这个问题是否能够正确的处理也是影响系统性能的一个重要因素。
综合以上提出的各种问题,在数据库设计阶段要综合考虑以下三个方面的因素。
Java建模
在建立Java对象模型的时候,要考虑数据库持久化的方便性,所建立的Java对象模型应该可以很容易地被数据所存储,并且数据库中也是越简单越好。
数据库结构
在设计数据库结构的时候也要考虑到是否可以很容易地用Java对象去表示。这里并不是简单的一个表对应一个对象的直接转换,更重要的是转换后的Java对象应该能够描述出数据间的关系。
所以在设计阶段,对于Java对象和数据库结构要进行综合考虑,也就是可以从两个方向进行考虑,毕竟两者之间不是一个时代的产物,设计的结果应该在两者之间达到一个平衡,虽然不能每一方都达到最优,但也不能造成有一方结构很差的情况。就像装水的木桶,最矮的板子决定水桶的容量。
业务需求
前面两个因素都是纯技术方面的考虑,在设计的过程中,更重要的是要紧扣业务需求。这是因为任何的软件系统都是以业务为中心的,那么对于系统的设计也不例外,在设计的阶段就应该考虑业务实现的方便性以及执行的效率。一个良好的结构设计不但使业务功能的实现变得非常容易并且可以避免很多复杂的操作,还可以达到提升系统性能的目的。
设计阶段是整个应用系统开发中的根基,其对软件的影响仅次于对系统需求的把握。所以在设计阶段应该对整个软件系统有一个整体的考虑,这里所说的具体设计也只是设计阶段中的很少的一部分,综合考虑多方面的因素才能达到更佳的性能。
在进行Hibernate性能优化时,需要从以下几个方面进行考虑:
数据库设计调整。
HQL优化。
API的正确使用(如根据不同的业务类型选用不同的集合及查询API)。
主配置参数(日志、查询缓存、fetch_size、batch_size等)。
映射文件优化(ID生成策略、二级缓存、延迟加载、关联优化)。
一级缓存的管理。
针对二级缓存,还有许多特有的策略。
事务控制策略。
数据的查询性能往往是影响一个应用系统性能的主要因素。对查询性能的影响会涉及到系统软件开发的各个阶段,例如,良好的设计、正确的查询方法、适当的缓存都有利于系统性能的提升。
系统性能的提升设计到系统中的各个方面,是一个相互平衡的过程,需要在应用的各个阶段都要考虑。并且在开发、运行的过程中要不断地调整和优化才能逐步提升系统的性能。
设计阶段的考虑问题
一个良好的数据库结构有利于系统性能的提升。这里所说的良好结构的数据库并不单纯是指满足数据库设计范式的数据库结构。这是因为,按照数据库范式所设计的数据库只能说在结构上是最优的,没有冗余数据等问题,但在生产过程中并不一定能获得最佳的性能。有时候适当地增加一些数据的冗余虽然增加了数据维护的难度,但可以极大地简化业务的查询,提高数据检索的效率。
在使用Java访问数据库的时候,还存在另外一个问题,就是面向对象的Java语言与关系型数据库之间的矛盾。在这两者之间必然要涉及到一个相互转化的问题,对于这个问题是否能够正确的处理也是影响系统性能的一个重要因素。
综合以上提出的各种问题,在数据库设计阶段要综合考虑以下三个方面的因素。
Java建模
在建立Java对象模型的时候,要考虑数据库持久化的方便性,所建立的Java对象模型应该可以很容易地被数据所存储,并且数据库中也是越简单越好。
数据库结构
在设计数据库结构的时候也要考虑到是否可以很容易地用Java对象去表示。这里并不是简单的一个表对应一个对象的直接转换,更重要的是转换后的Java对象应该能够描述出数据间的关系。
所以在设计阶段,对于Java对象和数据库结构要进行综合考虑,也就是可以从两个方向进行考虑,毕竟两者之间不是一个时代的产物,设计的结果应该在两者之间达到一个平衡,虽然不能每一方都达到最优,但也不能造成有一方结构很差的情况。就像装水的木桶,最矮的板子决定水桶的容量。
业务需求
前面两个因素都是纯技术方面的考虑,在设计的过程中,更重要的是要紧扣业务需求。这是因为任何的软件系统都是以业务为中心的,那么对于系统的设计也不例外,在设计的阶段就应该考虑业务实现的方便性以及执行的效率。一个良好的结构设计不但使业务功能的实现变得非常容易并且可以避免很多复杂的操作,还可以达到提升系统性能的目的。
设计阶段是整个应用系统开发中的根基,其对软件的影响仅次于对系统需求的把握。所以在设计阶段应该对整个软件系统有一个整体的考虑,这里所说的具体设计也只是设计阶段中的很少的一部分,综合考虑多方面的因素才能达到更佳的性能。
来源:oschina
链接:https://my.oschina.net/u/16840/blog/3397