应用程序开发人员和数据库管理员每天面临的一项挑战就是处理性能问题。虽然很多性能问题与数据库服务器有关,但也有一些性能问题与客户机应用程序有关。本文深入分析如何从应用程序客户机的角度诊断和隔离性能问题。您将学习如何排除使用 IBM® DB2® for Linux®, UNIX®, and Windows® 数据库的 Java™ 应用程序中出现的性能问题。一旦理解了性能问题的根源所在,离找到解决方案也就不远了。
问题诊断和 DB2 架构简介
本文的目的是帮助应用程序开发人员或数据库管理员排除和诊断在部署 Java 应用程序时可能遇到的常见性能问题。其中包括常见的应用程序开发问题,例如挂起或者响应缓慢。
很好地理解 DB2 架构、DB2 应用程序驱动程序和常见的 DB2 组件,对于有效地排除和诊断 Java 应用程序的问题很重要。DB2 客户端由几个层组成,每个组件都有它自己的跟踪实用程序,用于提供独特的信息,以帮助诊断不同类型的应用程序问题。所以在开始讨论不同的诊断工具之前,我们首先来看看 DB2 的客户机-服务器架构。
图 1 给出了 DB2 在客户端和服务器端使用的软件栈。 有两种方法可以连接到 DB2。图 1 中描绘的 Client 1 是最常用的配置。在此,诸如 DB2 Runtime Client 之类的 DB2 客户机是与应用程序一起安装的。DB2 Runtime Client 还包括 Universal JDBC Type 2 driver(也称 JCC T2)。
第二种方法,即 图 1 中描绘的 Client 2,不需要安装 DB2 客户机。 它不使用 DB2 客户机,而是使用 Universal JDBC Type 4 driver(也称 JCC T4),后者可以单独下载。为了使用 JCC T4 driver,应用程序开发人员必须在应用程序使用的 CLASSPATH 中包括 db2jcc.jar 和许可文件 db2jcc_license_*.jar。这两种类型的客户机都使用一种称作 Distributed Relational Database Architecture™(DRDA®)的开放数据库通信标准与 DB2 数据库服务器通信。
图 1. DB2 客户机/服务器架构
DB2 客户机提供很多类型的应用程序接口。图 2 显示了应用层,其中详述了可以与 DB2 一起使用的应用程序类型。其中大多数应用程序都通过 DB2 Call Level Interface(CLI)。JCC 驱动程序只限于 Java 应用程序,因为这是一个基于 Java 的应用程序。当出现问题时,取决于使用的应用程序的类型,应用程序开发人员可以收集下面描述的跟踪信息的组合。
Call Level Interface (CLI) Trace:大多数应用程序通过 CLI 层。
DB2 跟踪:在用户应用程序下和在 DRDA 通信层跟踪 DB2 客户端的内部工作情况。也可用于跟踪服务器端的问题。
JCC 跟踪:这是用于使用 DB2 Universal JDBC Driver 的应用程序的一个单独的跟踪实用程序。
JDBC 跟踪:跟踪遗留 JDBC Type 2 driver;但是不常用,因为对这一层的调用将被向下传递到 CLI 层。
图 2. 应用层详图
下面是在故障诊断时要记住的一些关键概念:
使用自上而下的方法进行故障诊断,而不是盯着细节,试图弄清楚那些细节是否与当前问题有关。
理解环境和配置。
应用程序在哪里运行?
数据库驻留在哪里?
每个系统上使用何种平台、何种操作系统和什么版本(修复包级别)的 DB2?
尽可能地简化环境和应用程序。
从应用程序的外面执行相同的查询是否会表现出相同的行为?
与从客户端运行查询相比,从服务器运行查询是否可以产生相同的响应?
注意最近的任何软件或硬件的变化。
只有在理解了环境并简化了问题域之后,才使用可用的跟踪功能向下探索以发现根本原因。
在客户端和服务器端应用程序以及 DB2 日志中查找相应的消息。
Developer Workbench 调试功能概述
Developer Workbench 提供一个全面的开发环境,为 SQL 和 Java 例程的开发和调试提供了便利。当创建一个存储过程时,应该在调适模式下创建例程。
图 3. 为新的存储过程启用调试
现在可以在存储过程中创建一些断点,然后单击 Debug 对话框开始调试。
图 4. Debug 对话框
在下面的屏幕快照中,调试器在每个断点处停下,并显示程序中的变量的当前状态。
图 5. 调试存储过程
图 6. 调试存储过程
Developer Workbench 是开发 Java 应用程序的一个方便的工具。但是,当存在性能问题时,应用程序开发人员就可能不知道哪个 Java 例程或哪部分代码的性能有缺陷。DB2 trace 功能可用于向下探索和隔离导致问题的应用程序。
CLI 跟踪概述
IBM Driver for Open Database Connectivity (ODBC) 和 Call Level Interface (CLI) 驱动程序是 DB2 数据库服务器的一个可调用 SQL 接口。JDBC type 2 driver、DB2 Perl module(DBD:DB2)、PHP Data Objects interface for DB2、IBM_DB driver for Ruby on Rails 和 .NET/ADO/OLEDB 提供程序构建在 IBM Driver for Open Database Connectivity (ODBC) 和 Call Level Interface (CLI) 驱动程序之上。
DB2 CLI trace 是 IBM driver for Open Database Connectivity (ODBC) 和 Call Level Interface (CLI) 驱动程序中内建的跟踪功能。所有直接或间接访问 CLI 层的应用程序都可以使用 CLI trace 来跟踪。DB2 CLI trace 包含不同的时间信息,这些信息可用于诊断应用程序的性能问题。
清单 1 中的 CLI trace 为每个 CLI 函数显示一个向外箭头(指向右边)和一个向内箭头(指向左边)。向外箭头显示自上次的 CLI 调用以来在应用程序中花费的时间。向内箭头显示在 DB2 客户机之外花费的时间,包括网络时间(来回)和在 DB2 服务器上花费的时间。例如,SQLExecute() 调用中显示的 1.828213E+001 秒(大约 18 秒)由 SQL 执行时间加上网络时间组成。可以提取出 SQLPrepareW() 语句中的 SELECT 语句,然后在数据库服务器的 DB2 CLP(命令行处理器)上本地运行它。如果在服务器上运行所花的时间要少得多,那么延迟可能是在网络层。
如果在服务器上的运行时间大致相同,那么 DBA 就必须调优服务器和 SQL 语句。
清单 1. SQLExecute() 中的执行时间
SQLPrepareW( hStmt=1:1, pszSqlStr="select * from EMPLOYEE", cbSqlStr=31 )
---> Time elapsed - +1.728000E-003 seconds
( StmtOut="select * from EMPLOYEE" )
...
...
SQLExecute( hStmt=1:1 )
---> Time elapsed - +2.145000E-003 seconds
( Package="SYSSH200 ", Section=4 )
sqlccsend( Handle - 186081616 )
sqlccsend( ulBytes - 487 )
sqlccsend( ) rc - 0, time elasped - +4.500000E-005
sqlccrecv( timeout - +0.000000E+000 )
sqlccrecv( ulBytes - 34736 ) - rc - 0, time elapsed - +1.823593E+001
( Requested Cursor Attributes=3 )
( Reply Cursor Attributes=524298 )
( Actual Cursor Attributes=524299 )
SQLExecute( )
<--- SQL_SUCCESS Time elapsed - +1.828213E+001 seconds