基礎系統的學生信息維護頁面,查詢顯示學生信息,但每次查詢過程都很慢,所以對該部分進行優化.
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毫秒
關於優化的分析請參考後續博客.