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