CowNew开源团队网站 http://www.cownew.com
论坛 http://www.cownew.com/newpeng/
转载请注明此版权信息
我准备给JDBMonitor增加一个性能监测报表的功能。用户在“报表条件”中填写要统计的起始时间、结束时间和单位时间后,点击查询。程序从DataBaseDBListener记录的表T_LOG_SQLLog中进行统计并显示报表。例如:用户在起始时间中输入”2006-5-30 18:00:00”,结束时间输入”2006-6-1 12:00:00”,时间单位选择“5分钟”,点击“查询”。程序将把T_LOG_SQLLog中FbeginTime大于等于”2006-5-30 18:00:00”,小于等于”2006-6-1 12:00:00”的记录过滤出来。然后统计每5分钟记录的条数(也就是数据库执行的次数),以时间序列图的形式显示成报表。
比如:
fid ftime
1 2006-05-05 10:00:00.000
2 2006-05-05 10:00:01.000
3 2006-05-05 10:00:10.000
4 2006-05-05 10:01:10.000
5 2006-05-05 10:01:20.000
这样的数据属于离散的数据,因为数据库的执行时间是不确定的,要把它们按统计它们的出现次数常常需要使用数据挖掘的东西。数据挖掘通常都是不同的数据库有不同的实现的,JDBMonitor是跨数据库的,因此肯定不能使用这些数据库特有的东西。现在也有一些开源的跨数据库的数据挖掘引擎,但是其尺寸巨大无比,都要50M以上。JDBMonitor是一个小的工具,为了方便部署和使用,JDBMontior的一个基本原则就是尽量避免使用JDK之外的类,所以肯定不能使用它们。我经过仔细思考,发现可以通过如下技巧来解决:
select count(sub.f) as exeCount,min(sub.FBeginTime) as FTime from(
select cast(DateDiff(ss,?,FBeginTime)/? as int) as f,FBeginTime from T_LOG_SQLLog
)as sub
where 1=1
and FBeginTime>=?
and FBeginTime<=?
group by sub.f
order by sub.f ASC
其中第一、三个参数传递用户选择的时间段的起始时间,第二个参数是用户选择的计时间隔(以秒为单位),参数四是用户选择的时间段的结束时间。
我采用的是整除的技巧来实现的这个效果。
其中FBeginTime是SQL语句执行的开始时间(在这里我们就把它看作SQL语句的执行时间),cast(DateDiff(ss,?,FBeginTime)/? as int) as f的意思就是计算SQL语句的执行时间到选择的时间段的起始时间之间的秒间隔数,然后再整除用户选择的计时间隔(以秒为单位)。经过整除以后同一个时间段内的数据就相同了,然后我们一个groupby,然后一个count(sub.f),这样各个时间段sql的执行次数就出来了。
以上边的数据为例,假如我输入的起始时间是2006-05-05 10:00:00.000,结束时间是2006-05-05 10:02:00.000。
那么select cast(DateDiff(ss,?,FBeginTime)/? as int) as f,FBeginTime from T_LOG_SQLLog的结果集就是:
f FBeginTime
0 2006-05-05 10:00:00.000
0 2006-05-05 10:00:01.000
0 2006-05-05 10:00:10.000
1 2006-05-05 10:01:00.000
1 2006-05-05 10:01:00.000
然后,以f为分组条件进行汇总,并统计f的count,这样各个时间段sql的执行次数就出来了:
3 2006-05-05 10:00:00.000
2 2006-05-05 10:01:00.000
当然不同的数据库的计算日期时间差和截取整数的方式是略有差异的,我这里用的是mssqlserver的语法。
分享到:
相关推荐
通过简单的配置步骤,就能实现SQL日志的记录,这对于理解应用程序与数据库的交互,优化数据库性能,以及排查系统故障具有重要的作用。在日常开发和维护工作中,掌握如何使用jbmonitor监听SQL,是提升开发效率和产品...
CowNew 技术杂志
在这个"使用Struts2实现的销售单CRUD"项目中,我们将深入探讨如何利用Struts2进行创建(Create)、读取(Retrieve)、更新(Update)和删除(Delete)操作,即常说的CRUD操作,针对销售单数据。 首先,理解CRUD操作的基本...
Delphi控件开发 1~8 由CowNew开源团队撰写。 文章将通过一个简单的例子来为初学者介绍编写控件的一些基本方法和模式。 这个例子控件叫TLeiLabel,是在TLabel的基础上增加两个实用的功能:一是使文字具有立体...
2. **数据浏览**:用户可以通过查看器浏览数据库中的表格记录,包括字段名、数据类型以及各条记录的数据,这对于数据分析和报告制作很有帮助。 3. **查询查看**:查看器允许用户查看已定义的SQL查询,理解查询逻辑...
正确的方法是使用JavaCore.create(IProject)方法将IProject转换为IJavaProject,而从IJavaProject获取IProject则可通过调用其getProject()方法实现。 其次,获取工作空间中的所有Java项目,通常可以通过遍历所有...
它主要用于Windows操作系统中,通过创建一个扩展名为`.bat`的文件来实现一系列自动化操作。批处理脚本可以包含简单的命令、变量处理以及逻辑控制结构等。 #### 创建与执行BAT文件 1. **创建批处理文件**: - 使用...
通过分析这些源码,我们可以深入了解步步高学习机的工作原理,从而对嵌入式系统、教育科技发展史以及80年代末90年代初的计算机编程有更深入的认识。 首先,我们来看"Bios.asm"。这是学习机启动时加载的第一个程序,...
**自定义事件** 的实现步骤如下: 1. 定义一个委托类型。 2. 声明一个事件,其类型为前面定义的委托类型。 ```csharp // 定义委托 public delegate void MessageHandler(string message); // 声明事件 public ...
- **JSON**:可能用于在客户端和服务器之间传输工作流数据,例如在保存或加载工作流时。 - **C#或VB.NET**:后端代码通常使用这些.NET语言来处理业务逻辑、持久化工作流定义和生成XOML文件。 文件`wfdesigner.htm`...
微软移动开发技术主要涵盖使用微软的.NET框架进行跨平台应用开发,尤其是针对移动设备如iOS、Android和Windows Phone。在本资源包“微软移动开发技术资料(1)”中,很可能是提供了关于如何利用.NET技术和相关工具...
在AJAX领域已经有一些非常好的图书出版,不过这些图书大都是用PHP、.Net等语言描述的,以Java实现的并不是很多,即使有也是浅尝辄止。不过《专家手记AJAX开发实战 》的出现改变了这一面貌。 这本书不仅用了大量...
#### 一、问题背景及原因分析 在Linux环境下,特别是字符终端中,用户可能会遇到ESC键操作时出现的延时问题。按照原设计,按下ESC键应立即触发特定操作(如弹出菜单),但实际上用户可能需要等待1到2秒才能看到预期...
6)模拟外设丰富,收音机用网络收音机模拟、用3D旋转模拟手机旋转、用地图选取模拟手机位置变化、振动器模拟器、加速度模拟器、用电脑摄像头模拟手机摄像头。 7)项目尽可能的模拟Windows Phone开发的所有特性,...
在.NET开发环境中,IIS(Internet Information Services)作为标准的Web服务器被广泛使用,它能够托管ASP.NET应用程序和Web服务。然而,对于开发和测试阶段,IIS的配置和管理可能相对复杂,这时嵌入式Web服务器就...
在本场景中,`TinyWeb web server` 是一个轻量级的Web服务器,它特别之处在于它支持用C语言编写CGI程序。这意味着开发者可以使用C语言这种强大的编程语言来创建动态内容,如网页表单处理、数据库查询等。 **TinyWeb...
IronPython是一种基于.NET框架的Python实现,它允许开发者在.NET平台上使用Python语法编写代码,并能够无缝集成.NET生态系统中的各种资源。IronPython与传统的CPython(标准Python解释器)相比,最大的优势在于它...