文档章节

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

jtn
 jtn
发布于 2015/04/13 12:37
字数 921
阅读 6
收藏 0

 最近,在开发和优化一个报表型的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

© 著作权归作者所有

jtn

jtn

粉丝 12
博文 879
码字总数 879609
作品 0
武汉
程序员
私信 提问
韩顺平玩转oracle之pl/sql听课笔记 《一》

要把程序做得有灵魂 By think 1 pl/sql是什么 过程,函数,触发器是pl/sql编写的。 过程,函数,触发器是在oracle的system表空间里面。 Pl/sql是非常强大的数据库过程化语言 过程,函数可以在...

长平狐
2012/09/19
109
0
DB2 最佳实践: 编写并调优查询语句以优化性能最佳实践

内容提要 通过 “IBM DB2 for Linux, UNIX, and Windows 最佳实践”专题,获得最常用的 DB2 9 产品配置实践指南,并使用这些知识提高 DB2 数据服务器的价值。 这些最佳实践文章给出了最优化方...

钟小华
2013/03/05
653
0
如何做好SQLite 使用质量检测,让事故消灭在摇篮里

本文由云+社区发表 SQLite 在移动端开发中广泛使用,其使用质量直接影响到产品的体验。 常见的 SQLite 质量监控一般都是依赖上线后反馈的机制,比如耗时监控或者用户反馈。这种方式问题是: ...

腾讯云加社区
2018/12/18
32
0
监控和剖析数据库操作-P6Spy、SQL Profiler、IronTrack SQL 使用简介

在我们 Java 开发应用程序的过程中,难免会碰到系统的性能问题,特别在企业应用的开发过程中,都会与数据库进行打交道。当我们碰到数据库性能时,最有效的就是直接跟踪每一个 SQL 语句的执行...

jiyayun
2012/11/05
338
0
TiDB 3.0.0 Beta.1 发布,分布式 NewSQL 数据库

TiDB 发布 3.0.0 Beta.1 版,对应的 TiDB-Ansible 版本为 3.0.0 Beta。相比 3.0.0 Beta 版本,该版本对系统稳定性、易用性、功能、优化器、统计信息以及执行引擎做了很多改进。更新内容如下:...

h4cd
03/28
2.2K
6

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
14
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
15
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部