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