最近,在开发和优化一个报表型的Web项目,底层是Hibernate和MySQL。

当报表数据量大的时候,一个图表要花4秒以上的时间。

以下是我的分析和体会。
 
 1.我首先需要知道哪些函数执行了多少时间,哪些sql花了多少时间。
  a.最笨最简单的方法是,每一个函数的调用开始和结尾都保存开始时间startTime和结束时间endTime,  进行计算。
  b.写一个“拦截器”,拦截每一个方法的执行,计算时间。
    这个又太难了,没啥思路。
  c.想到Hibernate查询,真正执行sql语句的方法是query.list()方法。
   因此,只需要计算query.list()这个方法的执行,大概就能得出每个函数的执行时间了。
   很巧的是,我写了一个功能强大的BaseDao,大部分查询最终归结到了一个方法。

  protected List executeQueryList(String hql, Map<String, Object> params,   Integer firstResult, Integer maxResults) {
Query query = createQuery(hql, params);
if (firstResult > 0) {
query.setFirstResult(firstResult);
} if (maxResults > 0) {
query.setMaxResults(maxResults);
}
Date startTime = new Date();
List list = query.list();
String costTime = CostTimeUtils.getCostTime(startTime);
println(query, costTime);
return list;
}

这样,我只需要在一个地方,计算耗费的时间,就大致知道了每个方法和sql语句的实际执行时间了。

2.看了下Hibernate打印出来的SQL语句和程序源码,发现执行的数据查询太多,平均每个0.02到0.05,少数需要0.34,0.35。

一个0.02s,查询几十次到上百次,花费的时间就多了。

3.少数查询要0.34,0.35, 应该是网络引起的??

后来,经过自己的分析,与同事好友的交流,可能的原因是查询的字段太多导致的,Hibernate通过反射向Java实体对象填充值,也需要花费一些时间。

然后,我又想到,TReport这个表字段确实不少,更关键的是我们把一些图表的信息存放在这个表里的longblob类型的字段。

4.字段的数据类型有影响么?

有些小数据量的字段,用的是longtext。

逐个将其统一为varchar。

5.统一Hibernate用法,方便查看HQL/SQL语句的执行时间。

以前我对项目进行重构过,现在大部分的查询都要经过BaseDao中的一个查询方法,

Date startTime = new Date();
List list = query.list();
String costTime = CostTimeUtils.getCostTime(startTime);
println(query, costTime);

但是,还有很多查询没有经过这里,导致有的SQL执行时间,不方便查看。

6.最初,想查看每个方法执行时间的时候,我首先想到的是找一个这样的工具。

不过,最后还是没能找到。

JProfile之类的工具,还没怎么用过,抽空再学习和应用下。

7.针对查询用到的SQL语句,建立合适的索引。

这个还没有头绪,正在摸索中。

8.查询方法执行效率不高?

public Treport getReportById(Integer reportId) {
String hql = "from Treport where reportId = :reportId";
Treport report = super.executeQueryUnique(hql, "reportId", reportId);
return report;
}

有的地方,根据HQL语句查询没有必要。

Treport表的主键就是reportId,可以使用Hibernate的get(id)来查。

多写了代码,维护麻烦,效率还不高。

我的感觉是:自己构造HQL语句查询,没有Hibernate的get方法效率高,没有具体去测试。

不足之处

上文都是一些比较浅显的分析,更为详细的优化过程,最近几周正在实践之中。

后续几篇,将详细描述分析和优化过程。

原文参见http://FansUnion.cn/articles/2843

一个Web报表项目的性能分析和优化实践(一):小试牛刀,统一显示SQL语句执行时间的更多相关文章

  1. 一个Web报表项目的性能分析和优化实践(四):MySQL建立索引,唯一索引和组合索引

    先大致介绍下项目的数据库信息. 数据库A:主要存放的通用的表,如User.Project.Report等. 数据库B.C.D:一个项目对应一个数据库,而且这几个项目的表是完全一样的. 数据库表的特点 ...

  2. 一个Web报表项目的性能分析和优化实践(三) :提高Web应用服务器Tomcat的内存配置,并确认配置正确

    摘要 上一篇,一个Web报表项目的性能分析和优化实践(一):小试牛刀,统一显示SQL语句执行时间 ,讲述了项目优化的整体背景,重点讲述了统一显示了Web项目SQL语句的执行时间. 本篇,将重点介绍提高 ...

  3. 一个Web报表项目的性能分析和优化实践(五):重构有助于性能优化么?

    项目从初次开发到现在,已经快3年了.期间,有N个工程师参与过. 需求方面:增加减少,反反复复,无数次:人力方面:增加减少,不稳定:时间方面:功能开发着急上线,Bug开发紧急修复. 因此,代码臃肿,问题 ...

  4. 一个Web报表项目的性能分析和优化实践(六):设置MySQL的最大连接数(max_connections)

    在上一篇文章中"一个Web报表项目的性能分析和优化实践(二):MySQL数据库连接不够用(TooManyConnections)问题的一次分析和解决案例"提到,项目中新增几个数据库 ...

  5. [置顶] 一个Web报表项目的性能分析和优化实践(一):小试牛刀,统一显示SQL语句执行时间

    最近,在开发和优化一个报表型的Web项目,底层是Hibernate和MySQL. 当报表数据量大的时候,一个图表要花4秒以上的时间. 以下是我的分析和体会.  1.我首先需要知道哪些函数执行了多少时间 ...

  6. 一个Web报表项目的性能分析和优化实践(二):MySQL数据库连接不够用(TooManyConnections)问题的一次分析和解决案例

    最近,项目中遇到了数据库连接不够的问题. 异常信息com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data ...

  7. 一个Web报表项目的性能分析和优化实践(七):性能监测工具JavaMelody

    简介 JavaMelody 能够监测Java或Java EE应用程序服务器,并以图表的方式显示:Java内存和Java CPU使用情况,用户Session数量,JDBC连接数,和http请求.sql请 ...

  8. mysql优化(三)–explain分析sql语句执行效率

    mysql优化(三)–explain分析sql语句执行效率 mushu 发布于 11个月前 (06-04) 分类:Mysql 阅读(651) 评论(0) Explain命令在解决数据库性能上是第一推荐 ...

  9. MySQL面试题之如何优化一条有问题的SQL语句?

    如何优化一条有问题的sql语句? 针对sql语句的优化.我们可以从如下几个角度去分析 回归到表的设计层面,数据类型选择是否合理 大表碎片的整理是否完善 表的统计信息,是不是准确的 审查表的执行计划,判 ...

随机推荐

  1. 亿财道APP赚钱攻略,亿财道,一个看广告年入36万的APP

            亿财道(http://etway.net/),一款看广告(传单)赚钱的软件,这是一项革新的广告产品,代替了以往的纸质传单.在商家节约成本的同时,还给阅读者佣金,推广也有相应提成比例. ...

  2. .NET 拼音汉字转化(全面)

    引言 这是一个.NET 用C#语言编写的  拼音转汉字类,考虑到有很多拼音转汉字,但是试用过发现大部分有很多生僻字都没有办法显示.在此分享一个支持绝大多数的较为全面的拼音汉字转化帮助类.不多说,代码附 ...

  3. KMP笔记

    KMP #include<iostream> #include<cstring> #include<cstdio> #include<cmath> us ...

  4. UI控件设置

    去掉cesium默认的版权信息: 在style样式中添加 .cesium-widget-credits {display:none !important} 去掉动画控件.地址搜索控件.图层选择控件.操 ...

  5. java几种远程服务调用协议的比较

    原文地址:http://www.cnblogs.com/jifeng/archive/2011/07/20/2111183.html 一.综述 本文比较了RMI,Hessian,Burlap,Http ...

  6. 中国象棋程序的设计与实现(六)--N皇后问题的算法设计与实现(源码+注释+截图)

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题. 该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列 ...

  7. [React] Refactor a Stateful List Component to a Functional Component with React PowerPlug

    In this lesson we'll look at React PowerPlug's <List /> component by refactoring a normal clas ...

  8. SQL Server 2008 备份数据库

    1.打开SQL , 找到要备份的数据库 , 右键 >> 任务 >>备份 2.弹出 [ 备份数据库对话框 ] ,如图: 3.点击加入 [ button ] . 例如以下图: 4. ...

  9. js控制textarea输入字符串的个数,鼠标按下抬起推断输入字符数

    [Html代码] <table> <tr> <td width="150">短信内容:</td> <td> <te ...

  10. hdu_3308 区间合并

    一两个月没写代码的确是手生的厉害,debug的好艰辛,,不过看到accept时的那种满足感真的就是爽 #include<iostream> #include<cstdio> # ...