一个Web报表项目的性能分析和优化实践(一):小试牛刀,统一显示SQL语句执行时间
最近,在开发和优化一个报表型的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语句执行时间的更多相关文章
- 一个Web报表项目的性能分析和优化实践(四):MySQL建立索引,唯一索引和组合索引
先大致介绍下项目的数据库信息. 数据库A:主要存放的通用的表,如User.Project.Report等. 数据库B.C.D:一个项目对应一个数据库,而且这几个项目的表是完全一样的. 数据库表的特点 ...
- 一个Web报表项目的性能分析和优化实践(三) :提高Web应用服务器Tomcat的内存配置,并确认配置正确
摘要 上一篇,一个Web报表项目的性能分析和优化实践(一):小试牛刀,统一显示SQL语句执行时间 ,讲述了项目优化的整体背景,重点讲述了统一显示了Web项目SQL语句的执行时间. 本篇,将重点介绍提高 ...
- 一个Web报表项目的性能分析和优化实践(五):重构有助于性能优化么?
项目从初次开发到现在,已经快3年了.期间,有N个工程师参与过. 需求方面:增加减少,反反复复,无数次:人力方面:增加减少,不稳定:时间方面:功能开发着急上线,Bug开发紧急修复. 因此,代码臃肿,问题 ...
- 一个Web报表项目的性能分析和优化实践(六):设置MySQL的最大连接数(max_connections)
在上一篇文章中"一个Web报表项目的性能分析和优化实践(二):MySQL数据库连接不够用(TooManyConnections)问题的一次分析和解决案例"提到,项目中新增几个数据库 ...
- [置顶] 一个Web报表项目的性能分析和优化实践(一):小试牛刀,统一显示SQL语句执行时间
最近,在开发和优化一个报表型的Web项目,底层是Hibernate和MySQL. 当报表数据量大的时候,一个图表要花4秒以上的时间. 以下是我的分析和体会. 1.我首先需要知道哪些函数执行了多少时间 ...
- 一个Web报表项目的性能分析和优化实践(二):MySQL数据库连接不够用(TooManyConnections)问题的一次分析和解决案例
最近,项目中遇到了数据库连接不够的问题. 异常信息com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data ...
- 一个Web报表项目的性能分析和优化实践(七):性能监测工具JavaMelody
简介 JavaMelody 能够监测Java或Java EE应用程序服务器,并以图表的方式显示:Java内存和Java CPU使用情况,用户Session数量,JDBC连接数,和http请求.sql请 ...
- mysql优化(三)–explain分析sql语句执行效率
mysql优化(三)–explain分析sql语句执行效率 mushu 发布于 11个月前 (06-04) 分类:Mysql 阅读(651) 评论(0) Explain命令在解决数据库性能上是第一推荐 ...
- MySQL面试题之如何优化一条有问题的SQL语句?
如何优化一条有问题的sql语句? 针对sql语句的优化.我们可以从如下几个角度去分析 回归到表的设计层面,数据类型选择是否合理 大表碎片的整理是否完善 表的统计信息,是不是准确的 审查表的执行计划,判 ...
随机推荐
- Quartz介绍和使用
Quartz介绍和使用 什么是Quartz,干什么的? Quartz框架是一个全功能.开源的任务调度服务,可以集成几乎任何的java应用程序—从小的单片机系统到大型的电子商务系统.Quartz可以执行 ...
- HDU 1241 Oil Deposits【DFS】
解题思路:第一道DFS的题目--- 参看了紫书和网上的题解-- 在找到一块油田@的时候,往它的八个方向找,直到在能找到的范围内没有油田结束这次搜索 可以模拟一次DFS,比如说样例 在i=0,j=1时, ...
- 3ds Max实例教程:制作雪的材质
导言: 本教程为大家讲解使用3ds MAX制作真实的雪材质制作过程,非常简单的教程,但个人觉得讲解的非常好,希望这套比较老的教程能给你带来帮助. 下面教程开始 雪的材质看似简单,其实它的制做并不是想像 ...
- 关于深度残差网络(Deep residual network, ResNet)
题外话: From <白话深度学习与TensorFlow> 深度残差网络: 深度残差网络的设计就是为了克服这种由于网络深度加深而产生的学习效率变低,准确率无法有效提升的问题(也称为网络退化 ...
- 简洁的MVC思想框架——Nancy(Post操作与外部引用css和JS)
之前介绍了关于Nancy配置与Get基础操作,以下来介绍有关Nancy的Post操作. 第一步,设计主界面,以登录界面为例:Login.cshtml 路径为: 设计好页面后,在之前的modules类中 ...
- HDU-1358 Period 字符串问题 KMP算法 求最小循环节
题目链接:https://cn.vjudge.net/problem/HDU-1358 题意 给一个字符串,对下标大于2的元素,问有几个最小循环节 思路 对每个元素求一下minloop,模一下就好 提 ...
- Linux 重启防火墙失败
CentOS 7 执行service iptables start出现redirecting to systemctl ...Failed to ...not loaded. 如果出现以下错误,好像说 ...
- sz xshell
yum install lrzsz -y
- cocos2dx2.0 与cocos2dx3.1 创建线程不同方式总结
尽管内容是抄过来的.可是经过了我的验证.并且放在一起就清楚非常多了,cocos2dx版本号常常变化非常大.总会导致这样那样的问题. cocos2dx2.0 中 1. 头文件 #include < ...
- [Javascript] String Padding in Javascript using padStart and padEnd functions
ES2017 added two new string functions. They are padStart and padEndfunctions. In this lesson, we wil ...