如果您开发了一个运行在 Oracle 应用服务器 (OracleAS) 或 Oracle Containers for JEE (OCJ) 上的 Java 应用程序那么您可以使用 Oracle 的动态监控服务 (DMS) 来测量您的应用程序的性能本文分几个简单的步骤说明了如何准备好您的应用程序以进行性能测量并如何读取结果
Oracle DMS 提供了一组 Java 和 C API 来为 OracleAS 和其它的 Oracle 产品测量和报告性能量度状态信息和诊断信息Oracle 产品调用 DMS 函数库例程来计算量度并把它们输出到 Oracle 企业管理器中有关监控和优化 OracleAS 及其组件的性能的详细信息请参见 Oracle Application Server g 性能指南
DMS 测量 API 小简单而高效为了创建定制的量度开发人员在事件发生时重要的时间段开始和结束时或者当预先计算的性能量度改变了它们的值时通知 DMS然后DMS 将量度发送到 Oracle 企业管理器将它们转储到文本文件中或者进行格式化以适合 web 浏览器
下面进行简要介绍首先您将需要确定您要测量应用程序的动作(可能以某种层次表示例如读时间和写时间可以结合构成总时间)然后创建一个准备这些定时事件的结构的专用 Java 类然后在 Java 应用程序的相关位置上调用这个专用类中的方法来启动和停止相关的定时器然后运行应用程序(运行多次以采集实际的平均值)并通过一个专门的 URL 来查看时间测量的结果
下面更详细地介绍了这个过程中的步骤
第 步确定您想要测量的应用程序部分
下面是根据我自己经验而编写的示例为了进行概念验证我的小组需要显示 Java 应用程序中的一个特定序列的步骤可以在 秒内执行我们想要测量总时间以及每一个步骤花费多少时间(从而我们能够指出需要改进的地方)
我们想要测量以下步骤所花费的时间(三层的层次结构)
总时间
检索数据(不需部分求和)
读取数据库
写入文件
计算
计算的初始化
重复计算步骤
提交结果
图形表示
字母数字表示
这些测量必须在应用程序的每次运行中进行以便您能够比较它们在不同情况下的值并为每一个应用程序组件计算平均时间就我们而言输入参数之一是计算步骤的数目因此我们运行了几次每次执行不同数量的步骤因此我们能够指出哪些部分有一致的性能以及如果我们增加步骤数对于其它的部分需要增加多少时间
第 步安装 dmsjar
找到 dmsjar(在 [OCJ_HOME]\lib 或 [OracleAS_HOME]\lib 中)并确保它在您的应用程序的类路径中(特别在开发环境中因为如果您部署到 OracleAS 或 OCJ 中那么在部署环境中它将已经存在)如果您使用 JDeveloper那么您可以将 dmsjar 作为一个资料库添加到 JDeveloper 项目设置中以实现这一目的为您的项目创建一个新的资料库然后在它的类路径中为 dmsjar 增加一个项目(指定到 dmsjar 的完整路径)
第 步创建类 PerformanceMeasurement
在您的 Java 应用程序中创建一个新的 Java 类在该类中您可以准备好测量层次结构列表 显示了一个准备第 步中说明的层次结构的示例类这个示例使用 DMS PhaseEvent 感应器(定时器)来测量在代码的完整特定部分中所花费的时间并且它使用 DMS Nouns(树结构)来在一个层次结构中组织 PhaseEvent 感应器这种层次结构类似于文件系统中的目录结构
第 步测量应用程序
现在在应用程序中的适当位置开始和停止相应的定时器已非常容易(用 DMS 的术语这称为 instrumenting)您所需要做就是初始化一个 PerformanceMeasurement 对象然后将这个对象传递给需要控制这些定时器中的某一个启动和停止的 Java 例程
下面是一个示例代码段
// Initialize Performance Measurement object
p = new PerformanceMeasurement(MyApplication_+numberOfSteps+_steps);
pstart(pTOTAL);
// And now the actual steps in the case
DataHandlergetData(p);
doCalculations(p);
generateChart(p);
您可以按您的需要频繁调用 pstart 和 pstop只要您确保对于某个定时器的每一次启动操作总存在对该定时器的停止操作
例如
pstart(pREADING);
// Load the Oracle JDBC driver and connect to the database
pstop(pREADING);
pstart(pWRITING);
// Initialize output file
pstop(pWRITING);
pstart(pREADING);
// Get first batch of data
pstop(pREADING);
pstart(pWRITING);
// Write first batch of data
pstop(pWRITING);
记住您还必须手动启动和停止 Total 和 Subtotal 定时器
第 步捕获一个页面在浏览器中完全显示的时刻
在我们的概念验证中将在浏览器中显示图形和字母数字数据所需的时间包括在我们的测量中是必需的我们的页面相当大因此完全加载它要花一些时间
我们使用一个 Javascript 陷阱来捕获结束时间Javascript 在客户机上执行因此如果您将一段脚本放在页面的末尾那么只有页面在客户机上完全加载时才执行在那段脚本中我们调用了另一个页面该页面调用了一个 Java 方法来停止相应的定时器
下面是一个示例 JSP 代码段
<jsp:useBean id=myApplicationBean class=MyApplicationBean scope=session>
<! Do all the calculation stuff first >
<%
myApplicationBeandoSteps();
myApplicationBeanpstart(myApplicationBeanpGRAPHICAL);
%>
show chart
<%
myApplicationBeanpstop(myApplicationBeanpGRAPHICAL);
myApplicationBeanpstart(myApplicationBeanpALPHANUMERIC);
%>
show alphanumerical data
<%
myApplicationBeanpstop(myApplicationBeanpALPHANUMERIC);
%>
<script>
windowopen(Stopjsp stop width=height=);
</script>
</JSP:USEBEAN>
<JSP:USEBEAN class=MyApplicationBeanid=myApplicationBean scope=session>
下面是 Stopjsp 的源代码
<%@ page contentType=text/html;charset=windows%>
<jsp:useBean id=hopCalBean class=HopCalBean scope=session/>
Stop!!!!
<% myApplicationBeanstop(); %>
myApplicationBeanstop() 方法包含以下 Java 代码
/*
* This method will be called after everything has been done
*/
public void stop()
{
pstop(pPRESENTATION_TOTAL);
pstop(pTOTAL);
pwriteLogFile(d://temp//MyApplicationPerformancelog);
}
第 步运行应用程序
现在将经过测量的应用程序部署到 OracleAS 或 OCJ 中并运行它DMS 将采集时间统计数据
如果您想比较几次运行的时间测量结果请多次运行您的应用程序(可能用不同的变量变量可以在初始化 PerformanceMeasurement 对象时放到运行名称中)
第 步在浏览器中查看 DMS 输出
如果您编写了对 pwriteLogFile 的调用那么您可以查看该日志文件的内容它包含原始的 DMS 数据
通过在应用服务器上调用一个特定的 URL可以找到一种更加清晰的数据表示方法用您的 Java 应用程序使用的应用服务器的主机名和端口号来替换 [host:port]
对于独立的 OCJ使用//[host:port]/dms/Spy
对于 OracleAS使用//[host:port]/dmsocj/Spy
您将看到如下页面
educitycn/img_///gif>正如您所看到的DMS 还收集 JDBCJVM 和 OCJ 的统计数据并且无需任何进一步的调整关于内置性能量度的一个列表请参见 Oracle Application Server g 性能指南的附录 A
要查看某种类别的详细信息请单击左边框中的名称
educitycn/img_///gif>总结
如果您以一种结构化的方式安装了 DMS Nouns 和 DMS PhaseEvent Sensors(利用一个 PerformanceMeasurement 类)那么利用 DMS您可以容易地测量您的 Java 应用程序的性能并且获得性能时间测量结果的一种易读的结构化输出