最近,在开发和优化一个报表型的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. JqGrid 查询时未设置初始页码导致的问题

    本文所述问题发生在查询的数据有至少2页数据时的情况下.本例中的产品质量查询就是这样. 第一步:查询该时间段内的数据,结果为13页的数据内容,显示当前页第1页.如下图所示: 第二步:点击翻页按钮,打开第 ...

  2. Mojo For Chromium Developers

    Overview This document contains the minimum amount of information needed for a developer to start us ...

  3. 不实例化一个 class 的时候使用它的property

    class A: @property def name(self): " print(A.name) # <property object at 0x10d54cf98> cla ...

  4. POJ-1511 Invitation Cards 往返最短路 邻接表 大量数据下的处理方法

    题目链接:https://cn.vjudge.net/problem/POJ-1511 题意 给出一个图 求从节点1到任意节点的往返路程和 思路 没有考虑稀疏图,上手给了一个Dijsktra(按紫书上 ...

  5. POJ-3660 Cow Contest Floyd传递闭包的应用

    题目链接:https://cn.vjudge.net/problem/POJ-3660 题意 有n头牛,每头牛都有一定的能力值,能力值高的牛一定可以打败能力值低的牛 现给出几头牛的能力值相对高低 问在 ...

  6. ubuntu 16.04 安装KVM-多系统

    为了使用QQ 只能再跑一个Windows了

  7. 关于 Error: No PostCSS Config found in 的错误

    问题描述: 项目在本地运行不报错,上传到 GitHub 之后,再 clone 到本地, npm install 安装完成之后再执行 npm run dev 这时报错 Error: No PostCSS ...

  8. docker mysql镜像忽略表名大小写

    原文:docker mysql镜像忽略表名大小写 1.安装mysql镜像 docker pull mysql/mysql-server 2.运行mysql docker run --net=host ...

  9. 在VS2013中配置QT5 win7_64

    转自 在VS2013中配置QT5 win7_64 环境: win x64 + vs2013+QT5+vs_addin 下面示例正确配置QT以及VS2013 + QT Addin开发环境: 下载VS20 ...

  10. Hololens官方教程精简版 - 08. Sharing holograms(共享全息影像)

    前言 注意:本文已更新到5.5.1f1版本号 本篇集中学习全息影像"共享"的功能,以实如今同一房间的人,看到"同一个物体".之所以打引號,是由于.每一个人看到的 ...