【系统性能优化】Hibernate调优

基础系统的学生信息维护页面,查询显示学生信息,但每次查询过程都很慢,所以对该部分进行优化.

Hibernate调优是使用SSH框架很常见的问题,一般可以从以下几方面考虑:

一、数据库设计调整

二、主配置参数(ID生成策略,二级缓存,lazy加载)

三、一级缓存管理

四、事务控制策略

五、HQL优化

我们这里的优化,是对hql语句的优化,考虑使用select
newmap代替hibernate的级联查询。

先说说实体关联关系是怎么样的:

在学生实体Student中,classes是作为一个关联实体而存在的.

在数据库中表现为tb_student表中有一个classesId字段.

在班级实体classes中,institution(专业)也是作为一个关联实体而存在的.

在数据库表中表现为tb_classes表中有一个institutionId字段.

同样地,institution实体中,nodeLevel(学校层次)也是作为一个关联实体而存在的.

在数据库表中表现为tb_institution表中有一个levelId字段.

介绍完实体级联关系和数据库表结构,我们来看看真实数据.

学生表中有1.8万条数据,如下所示.

我做的是分页查询,每页10条学生信息.

优化前:

查询语句:

<span style="white-space:pre">	</span>String hql ="From Student where isDelete =:isDelete ";

查询过程:

发送150条select语句,用时28秒.

11:43:37,290 INFO  [stdout] (http-localhost/127.0.0.1:8080-1)28690毫秒

优化后:

查询语句:

         String hql="select new map (S.id as id,"
		+ "S.name as name,"
		+ "S.comment as comment,"
		+ "S.remark as remark,"
		+ "S.accountAddress as accountAddress,"
		+ "S.code as code,"
		+ "S.email as email,"
		+ "S.identityCardID as identityCardID,"
		+ "S.classes.className as className,"
		+ "S.classes.institution.institutionName as institutionName,"
		+ "S.classes.institution.parentInstitution.institutionName as parentInstitution,"
		+ "S.classes.institution.schoolLevel.levelName as levelName,"
		+ "S.classes.institution.id as institutionId,"
		+ "P.professionalName as professionalName "
		+ ") from Student as S  left join S.professional as P "
		+" where S.isDelete=:isDelete ";

查询过程:

共发送1条语句,用时38毫秒.

17:45:38,054 INFO  [stdout] (http-localhost/127.0.0.1:8080-6)Hibernate: select count(*) as col_0_0_ from TB_Student student0_ left outerjoin TB_Professional profession1_ on student0_.professionalId=profession1_.id
wherestudent0_.isDelete=?

17:45:38,080 INFO  [stdout] (http-localhost/127.0.0.1:8080-6)Hibernate: select student0_.id as col_0_0_, student0_.name as col_1_0_,student0_.comment as col_2_0_, student0_.remark as col_3_0_,student0_.accountAddress
as col_4_0_, student0_.code as col_5_0_,student0_.email as col_6_0_, student0_.entranceDate as col_7_0_,student0_.graduateSchool as col_8_0_, student0_.identityCardID as col_9_0_,classes2_.className as col_10_0_, institutio4_.InstitutionName as col_11_0_,institutio7_.InstitutionName
as col_12_0_, schoolleve10_.levelName ascol_13_0_, classes2_.institutionId as col_14_0_, profession1_.professionalNameas col_15_0_ from TB_Student student0_ left outer join TB_Professionalprofession1_ on student0_.professionalId=profession1_.id, TB_Classes
classes2_,TB_Institution institutio4_, TB_Institution institutio7_, TB_SchoolLevelschoolleve10_ where student0_.calssesId=classes2_.id andclasses2_.institutionId=institutio4_.id and institutio4_.pId=institutio7_.idand institutio4_.levelId=schoolleve10_.id
and student0_.isDelete=? limit ?

17:45:38,091 INFO  [stdout] (http-localhost/127.0.0.1:8080-6)38毫秒

关于优化的分析请参考后续博客.

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-20 22:26:56

【系统性能优化】Hibernate调优的相关文章

PLSQL_硬解析和解析的区别(案例)(进行SQL优化性能调优的基础,了解解析过程)

2014-08-11 BaoXinjian 一.摘要 Oracle硬解析和软解析是我们经常遇到的问题,所以需要考虑何时产生软解析何时产生硬解析,如何判断 SQL的执行过程 当发布一条SQL或PL/SQL命令时,Oracle会自动寻找该命令是否存在于共享池中来决定对当前的语句使用硬解析或软解析. 通常情况下,SQL语句的执行过程如下: Step1. SQL代码的语法(语法的正确性)及语义检查(对象的存在性与权限). Step2. 将SQL代码的文本进行哈希得到哈希值. Step3. 如果共享池中存

Java程序性能优化——性能调优层次

为了提升系统性能,开发人员可以从系统的各个角度和层次对系统进行优化.除了最常见的代码优化外,在软件架构上.JVM虚拟机层.数据库以及操作系统层都可以通过各种手段进行调优,从而在整体上提升系统的性能. 设计调优 设计调优处于所有调优手段的上层,它往往需要在软件开发之前进行.在软件开发之初,软件架构师就应该评估系统可能存在的各种潜在的问题,并给出合理的设计方案.由于软件设计和架构对软件整体有决定性的影响,所以,设计调优对系统性能的影响也是最大的.如果说,代码优化.JVM优化都是对系统微观层面上"量&

Greenplum优化--SQL调优篇

目录 数据库查询预准备 VACUUM ANALYZE EXPLAIN执行计划 两种聚合方式 关联 重分布 查询优化 explain参数 选择合适分布键 分区表 压缩表 分组扩展 窗口函数 列存储和行存储 函数和存储过程 索引使用 NOTIN 聚合函数太多 资源队列 其它优化技巧 参考 数据库查询预准备 VACUUM vacuum只是简单的回收空间且令其可以再次使用,没有请求排它锁,仍旧可以对表读写 vacuum full执行更广泛的处理,包括跨块移动行,以便把表压缩至使用最少的磁盘块数目存储.相

性能优化-优化-JVM调优

1.JDK版本 尽可能的使用高版本的JDK版本,这通常可以带来免费的性能提升.当前前提是版本是稳定的,并且相应的应用服务器或者开源第三方工具等,也可以基于此版本稳定运行. 2.字节码验证 如果编译的代码,以及依赖的第三方jar包都是可信赖的话,可以关闭字节码验证,从而节省类加载时间,可通过-XVerify:none关闭字节码验证. 3.JIT编译方式 HotSpot有2种JIT编译方式,分别是Client模式和Server模式,Client模式的特点是启动快.占用内存少.JIT编译器生成代码的速

【Android】开发优化之——调优工具:TrackView,Method Profiling

Android SDK自带的tool TrackView 位于 sdk的tools目录下.用法为:进入到tools下,运行 traceview e:\loginActivityTracing.trace 即可.那trace文件怎么生成的呢. 有两种方式生成 1.使用代码生成,想调哪调哪. 只需要在需要调用的地方调用 Debug.startMethodTracing("loginActivityTracing"); 和结束调用的地方调用 Debug.stopMethodTracing()

Oracle数据库进行优化、调优的步骤

明确系统当前的状况 系统服务器的型号 CPU的速度以及数量 内存大小 I/O设备情况 网络状况 系统用户数量以及并发用户数量 目前系统CPU使用率.内存使用率 目前I/O系统的状态(平均读写响应时间.I/O等待时间等) 那么怎样才能了解到上面所需要的信息呢?对于系统服务器的型号.CPU的速度以及数量和内存大小,这个相信大家很容易知道.那么下就分别对I/O设备情况.网络状况.系统用户数量以及并发用户数量.目前系统CPU使用率.内存使用率.目前I/O系统状态(平均读写响应时间.I/O等待时间)在wi

(转)MySQL慢查询分析优化 + MySQL调优

1.long_query_time的默认值为10,意思是运行10S以上的语句. 2.临时设置开启慢查询日志 mysql> show variables like '%slow_query_log%'; +---------------------+------------------------------------------+ | Variable_name | Value | +---------------------+---------------------------------

【Hibernate 8】Hibernate的调优方法:抓取策略

在上一篇博客中,介绍了Hibernate的缓存机制.合理的配置缓存,可以极大程度上优化Hibernate的性能.这篇博客,介绍另外一个调优方式:抓取策略. 一.什么是抓取策略 抓取策略(fetching strategy):当应用程序需要在关联关系间进行导航的时候,Hibernate如何获取关联对象的策略.抓取策略可以在O / R映射的元数据中声明,也可以在特定的HQL或条件查询(Criteria Query)中重载声明. 二.Hibernate的抓取策略 在Hibernate中,主要包括四种抓

tomcat7性能调优指导书

注意:调优tomcat需要了解使用的tomcat是什么版本,随着tomcat版本发展有新参数引入,同时有旧参数废弃.本文档以tomcat7为例进行调优 一. 线程池(Thread Pool)优化 编辑“Tomcat安装目录/conf/server.xml”文件,找到如下内容 <!-- <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150&quo