InfoSphere Change Data Capture 与 DataDirect Spy for JDBC

如何跟踪 JDBC 调用

在本文中,我们将了解如何使用面向 Oracle、Sybase 和 SQL Server 的 DataDirect Spy for JDBC 来追踪 IBM® 数据复制产品 InfoSphere® Change Data Capture (CDC) 中的 JDBC 调用。

Awajeet Arya, 软件开发人员, IBM

Awajeet Arya 是 IBM 位于印度班加罗尔软件实验室的一名软件工程师。他目前致力于保障和控制 IBM 的 Change Data Capture (CDC) 技术质量。他的兴趣领域包括 Java 中间件和服务器端技术。



2012 年 10 月 08 日

免费下载:IBM® DB2® Express-C 10.1 免费版 或者 DB2® 10.1 for Linux®, UNIX®, and Windows® 试用版
下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。

概述

DataDirect Spy 支持 JDBC 驱动程序跟踪,这对于解决客户问题是非常有用的。IBM InfoSphere Change Data Capture 引擎使用 DataDirect JDBC 驱动程序来实现仅针对 Oracle、SQL Server 和 Sybase 的 JDBC 数据库访问。

DataDirect Spy 是一个在运行程序中跟踪调用的工具。该工具将应用程序发出的调用传递给基础 DataDirect JDBC 驱动程序,并记录关于这些调用的详细信息。从数据库向应用程序传回的结果也会被记录。如果问题被怀疑是出现在驱动程序和数据库之间(也就是,应用程序到驱动程序问题已排除),那么结果日志可用于解决故障问题。


先决条件

要理解本文内容,应具备以下基础知识:

  • Windows®
  • UNIX®
  • 使用 IBM InfoSphere CDC Management Console
  • 使用面向 Oracle, Sybase, SQL Server 的 IBM InfoSphere CDC

关于 DataDirect Spy

JDBC API 支持查看数据库和 JDBC 驱动程序生成的警告和异常。一个 SQLException 对象包含一个错误描述、X/Open SQLState 和驱动程序供应商的错误代码编号。要查看异常,可以使用一个 catch 块将它们打印出来。警告属于 SQLException 的一个子类,用来处理数据库访问警告。警告不能阻止应用程序的执行;只是警告用户有些事情没有按计划进行,比如特权没按要求撤回。警告将在 Connection 对象、Statement 对象(包括 PreparedStatement 和 CallableStatement 对象)和 ResultSet 对象中报告。可使用 getWarnings 方法检索这些对象中的警告。

DataDirect Technologies 通过提供一个 JDBC Software Developer 的 Kit (SDK) 使得 JDBC 应用程序调试和故障排除变得更为容易,JDBC Software Developer's Kit (SDK) 在运行的应用程序中提供 DataDirect Spy for JDBC 跟踪和调用。该实用程序将应用程序发出的调用传递给基础 DataDirect JDBC 驱动程序并记录详细的调用信息。从数据库传回到应用程序的结果也被记录。DataDirect Spy 与正在运行的应用程序一起试用以跟踪该应用程序发出的 JDBC 调用。

DataDirect Spy 提供以下优势:

  • 日志记录是 JDBC 4.0 兼容的。
  • 日志记录是一致的,与所用的 DataDirect Connect for JDBC 驱动程序无关。
  • 可记录 JDBC 调用的所有参数和函数结果。
  • 日志记录与所有 DataDirect Connect for JDBC 驱动程序一起使用。
  • 无需更改应用程序就可以启用日志记录。

DataDirect Spy 属性

DataDirect Spy 支持以下属性。

表 1. DataDirect Spy 属性及描述
属性描述
log=System.out定向日志到 Java™ 输出标准:System.out。
log=(file)filename重定向日志到文件名指定的文件。
linelimit=numberofchars设置 DataDirect Spy 可在任何一行记录的最大字符数。默认是 0(没有最大值限制)。
logIS={yes | no | nosingleread}指定 DataDirect Spy 是否记录 InputStream 和 Reader 对象上的活动。当为 logIS=nosingleread 时,InputStream 和 Reader 对象上的日志记录是活动的。然而,单字节读取 InputStream.read 或单字符 Reader.read 的日志记录将被抑制,以防止生成大量包含单字节或单字符读取消息的日志文件,默认值是 no。
logTName={yes | no}指定 DataDirect Spy 是否记录当前线程的名称。默认值是 no。
timestamp={yes | no}指定每行 DataDirect Spy 日志是否包含一个时间戳,默认值是 no。

启用 DataDirect Spy 跟踪的步骤

要启用跟踪,假设已创建了一个实例并通过 InfoSphere CDC Management Console 中的数据存储进行了连接。以下步骤将向您展示如何使用 InfoSphere CDC 启用 DataDirect Spy for JDBC 跟踪:

  1. 将一个系统参数添加到已连接的数据存储。选择 Connected datastore 并单击 File > DataStore > Properties,如下所示。
    图 1. 调用系统参数选项,将系统参数添加到已连接的数据存储
    该图显示调用系统参数选项,将系统参数添加到已连接的数据存储
  2. 单击 System Parameters 选项卡,然后单击 Add 添加参数,启用面向 JDBC 的 DataDirect Spy 跟踪,如下所示。
    图 2. 将所需系统参数添加到已连接的数据存储
    该图显示将所需系统参数添加到已连接的数据存储
  3. datadirect_spy_attributes 作为参数名,将其值设置为 log=(file)filename;logTName=yes;timestamp=yes,如图 3 所示。系统参数 datadirect_spy_attributes(版本 V6.3 开始提供)未经记录。启用 IBM InfoSphere CDC 的 JDBC Spy 属性并不取决于数据库版本或平台。
    图 3. 提供值及参数名
    该图显示提供的值及参数名

    另外,对于一个命令行实例,可以使用 IBM InfoSphere Change Data Capture CLI 工具 dmset 来设置该参数。

    例如:dmset -I (Instance-name) property_name[=[property_value]]

  4. 重启 CDC 实例并启动复制。

InfoSphere CDC 收集的样例 Spy 跟踪日志

您可以看到一个跟踪日志作为 datadirect_spy_attributes 系统参数设置的值。在 清单 1 中参阅部分跟踪日志内容。

清单 1. spyTrace.log 部分内容
spy>> Connection[1].getMetaData()
spy>> OK (DatabaseMetaData[1])
                
spy>> DatabaseMetaData[1].getURL()
spy>> OK (jdbc:datamirror:oracle:;CATALOGOPTIONS=0;CONNECTIONRETRYDELAY=1;
BULKLOADBATCHSIZE=1000;SUPPORTLINKS=false;MAXPOOLEDSTATEMENTS=0;
SPYATTRIBUTES=log=(file)/scratch/arya/spytrace.log;KEYSTORE=;
STRINGPARAMSMUSTMATCHCHARCOLUMNS=true;PROGRAMID=;ENABLECANCELTIMEOUT=false;
TRUSTSTOREPASSWORD=;VALIDATESERVERCERTIFICATE=true;CODEPAGEOVERRIDE=;
REFCURSORSUPPORT=true;KEYSTOREPASSWORD=;EDITIONNAME=;CONNECTIONRETRYCOUNT=5;
SENDFLOATPARAMETERSASSTRING=false;COMMITBEHAVIOR=serverDefault;ENABLEBULKLOAD=false;
TNSSERVERNAME=UTF11G2B;BATCHPERFORMANCEWORKAROUND=true;INITIALIZATIONSTRING=;
FAILOVERPRECONNECT=false;REPORTRECYCLEBIN=true;ENABLESERVERRESULTCACHE=false;
RESULTSETMETADATAOPTIONS=0;CLIENTUSER=;QUERYTIMEOUT=0;HOSTNAMEINCERTIFICATE=;
FAILOVERGRANULARITY=nonAtomic;WIREPROTOCOLMODE=2;
APPLICATIONNAME=CDC-Update Instance Name;JAVADOUBLETOSTRING=false;LOGTNAME=yes;
LOADLIBRARYPATH=;INITIALCOLUMNBUFFERSIZE=-1;IMPORTSTATEMENTPOOL=;ALTERNATESERVERS=;
SDUSIZE=;TIMESTAMP=yes;ACTION=;KEYPASSWORD=;BULKLOADOPTIONS=0;
MODULE=CDC-Update Instance Name;ENCRYPTIONMETHOD=NoEncryption;ACCOUNTINGINFO=main;
CONVERTNULL=1;TRUSTSTORE=;TNSNAMESFILE=/db/oracle/11.2.0/network/admin/tnsnames.ora;
JDBCBEHAVIOR=1;FAILOVERMODE=connect;AUTHENTICATIONMETHOD=auto;LOGINTIMEOUT=30;
SERVICENAME=;SERVERTYPE=;LOADBALANCING=false;WORKAROUNDS=0;SID=;
INSENSITIVERESULTSETBUFFERSIZE=2048;SYSLOGINROLE=;CLIENTHOSTNAME=;
FETCHTSWTZASTIMESTAMP=true;CLIENTID=CDC-Update Instance Name)
                
spy>> DatabaseMetaData[1].getDriverName()
spy>> OK (Oracle)
                
spy>> DatabaseMetaData[1].getDriverVersion()
spy>> OK (4.2.1.030249 (F044244.U015812))
                
spy>> DatabaseMetaData[1].getDatabaseProductName()
spy>> OK (Oracle)
                
spy>> DatabaseMetaData[1].getDatabaseProductVersion()
spy>> OK (11.2.0.1.0)
                
spy>> Connection Options : 
spy>> 		CATALOGOPTIONS=0
spy>> 		CONNECTIONRETRYDELAY=1
spy>> 		BULKLOADBATCHSIZE=1000
spy>> 		SUPPORTLINKS=false
spy>> 		MAXPOOLEDSTATEMENTS=0
spy>> 		SPYATTRIBUTES=log=(file)/scratch/arya/spytrace.log
spy>> 		KEYSTORE=
spy>> 		STRINGPARAMSMUSTMATCHCHARCOLUMNS=true
spy>> 		PROGRAMID=
spy>> 		ENABLECANCELTIMEOUT=false
spy>> 		TRUSTSTOREPASSWORD=
spy>> 		VALIDATESERVERCERTIFICATE=true
spy>> 		CODEPAGEOVERRIDE=
spy>> 		REFCURSORSUPPORT=true
spy>> 		KEYSTOREPASSWORD=
spy>> 		EDITIONNAME=
spy>> 		CONNECTIONRETRYCOUNT=5
spy>> 		SENDFLOATPARAMETERSASSTRING=false
spy>> 		COMMITBEHAVIOR=serverDefault
spy>> 		ENABLEBULKLOAD=false
spy>> 		TNSSERVERNAME=UTF11G2B
spy>> 		BATCHPERFORMANCEWORKAROUND=true
spy>> 		INITIALIZATIONSTRING=
spy>> 		FAILOVERPRECONNECT=false
spy>> 		REPORTRECYCLEBIN=true
spy>> 		ENABLESERVERRESULTCACHE=false
spy>> 		RESULTSETMETADATAOPTIONS=0
spy>> 		CLIENTUSER=
spy>> 		QUERYTIMEOUT=0
spy>> 		HOSTNAMEINCERTIFICATE=
spy>> 		FAILOVERGRANULARITY=nonAtomic
spy>> 		WIREPROTOCOLMODE=2
spy>> 		APPLICATIONNAME=CDC-Update Instance Name
spy>> 		JAVADOUBLETOSTRING=false
spy>> 		LOGTNAME=yes
spy>> 		LOADLIBRARYPATH=
spy>> 		INITIALCOLUMNBUFFERSIZE=-1
spy>> 		IMPORTSTATEMENTPOOL=
spy>> 		ALTERNATESERVERS=
spy>> 		SDUSIZE=
spy>> 		TIMESTAMP=yes
spy>> 		ACTION=
spy>> 		KEYPASSWORD=
spy>> 		BULKLOADOPTIONS=0
spy>> 		MODULE=CDC-Update Instance Name
spy>> 		ENCRYPTIONMETHOD=NoEncryption
spy>> 		ACCOUNTINGINFO=main
spy>> 		CONVERTNULL=1
spy>> 		TRUSTSTORE=
spy>> 		TNSNAMESFILE=/db/oracle/11.2.0/network/admin/tnsnames.ora
spy>> 		JDBCBEHAVIOR=1
spy>> 		FAILOVERMODE=connect
spy>> 		AUTHENTICATIONMETHOD=auto
spy>> 		LOGINTIMEOUT=30
spy>> 		SERVICENAME=
spy>> 		SERVERTYPE=
spy>> 		LOADBALANCING=false
spy>> 		WORKAROUNDS=0
spy>> 		SID=
spy>> 		INSENSITIVERESULTSETBUFFERSIZE=2048
spy>> 		SYSLOGINROLE=
spy>> 		CLIENTHOSTNAME=
spy>> 		FETCHTSWTZASTIMESTAMP=true
spy>> 		CLIENTID=CDC-Update Instance Name
spy>> Driver Name = Oracle
spy>> Driver Version = 4.2.1.030249 (F044244.U015812)
spy>> Database Name = Oracle
spy>> Database Version = 11.2.0.1.0
                
spy>> Connection[1].setTransactionIsolation(int level)
spy>> level = 2
spy>> OK
                
spy>> Connection[1].createStatement()
spy>> OK (Statement[1])
                
spy>> Statement[1].execute(String sql)
spy>> sql = ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,'
spy>> OK (false)
                
spy>> Statement[1].close()
spy>> OK
                
spy>> Connection[1].createStatement()
spy>> OK (Statement[2])
                
spy>> Statement[2].executeQuery(String sql)
spy>> sql = select distinct sid from v$mystat
spy>> OK (ResultSet[1])
                
spy>> ResultSet[1].next()
spy>> OK (true)
                
spy>> ResultSet[1].getInt(int columnIndex)
spy>> columnIndex = 1
spy>> OK (398)
                
spy>> ResultSet[1].close()
spy>> OK
                
spy>> Statement[2].close()
spy>> OK
                
spy>> Connection[1].createStatement()
spy>> OK (Statement[3])
                
spy>> Statement[3].executeQuery(String sql)
spy>> sql = SELECT * FROM "SRC".TS_AUTH
spy>> OK (ResultSet[2])
                
spy>> ResultSet[2].next()
spy>> OK (true)
                
spy>> ResultSet[2].close()
spy>> OK
                
spy>> Statement[3].executeQuery(String sql)
spy>> sql = SELECT * FROM "SRC".TS_BOOKMARK
spy>> OK (ResultSet[3])
                
spy>> ResultSet[3].next()
spy>> OK (false)
                
spy>> ResultSet[3].close()
spy>> OK
                
spy>> Statement[3].executeQuery(String sql)
spy>> sql = SELECT PROP, VAL FROM "SRC".TS_AUTH
spy>> OK (ResultSet[4])
                
spy>> ResultSet[4].next()
spy>> OK (true)
                
spy>> ResultSet[4].getString(int columnIndex)
spy>> columnIndex = 1
spy>> OK (INSTANCEID)
                
spy>> ResultSet[4].getString(int columnIndex)
spy>> columnIndex = 2
spy>> OK (1323376560727)
                
spy>> ResultSet[4].next()
spy>> OK (true)
                
spy>> ResultSet[4].getString(int columnIndex)
spy>> columnIndex = 1
spy>> OK (INSTANCENAME)
                
spy>> ResultSet[4].getString(int columnIndex)
spy>> columnIndex = 2
spy>> OK (AW)
                
spy>> ResultSet[4].next()
spy>> OK (true)
                
spy>> ResultSet[4].getString(int columnIndex)
spy>> columnIndex = 1
spy>> OK (INSTALLDIR)
                
spy>> ResultSet[4].getString(int columnIndex)
spy>> columnIndex = 2
spy>> OK (/scratch/arya/Pack177)
                
spy>> ResultSet[4].next()
spy>> OK (true)
                
spy>> ResultSet[4].getString(int columnIndex)
spy>> columnIndex = 1
spy>> OK (INSTALLTIME)
                
spy>> ResultSet[4].getString(int columnIndex)
spy>> columnIndex = 2
spy>> OK (Thu Dec 08 15:36:13 EST 2011)
                
spy>> ResultSet[4].next()
spy>> OK (true)
                
spy>> ResultSet[4].getString(int columnIndex)
spy>> columnIndex = 1
spy>> OK (INSTALLVER)
                
spy>> ResultSet[4].getString(int columnIndex)
spy>> columnIndex = 2
spy>> OK (V6R5M1T0)
                
spy>> ResultSet[4].next()
spy>> OK (true)
                
spy>> ResultSet[4].getString(int columnIndex)
spy>> columnIndex = 1
spy>> OK (INSTALLUSER)
                
spy>> ResultSet[4].getString(int columnIndex)
spy>> columnIndex = 2
spy>> OK (awajarya)
                
spy>> ResultSet[4].next()
spy>> OK (true)
                
spy>> ResultSet[4].getString(int columnIndex)
spy>> columnIndex = 1
spy>> OK (TESTSTRING)
                
spy>> ResultSet[4].getString(int columnIndex)
spy>> columnIndex = 2
spy>> OK (1341f681399)
                
spy>> ResultSet[4].next()
spy>> OK (false)
                
spy>> Statement[3].close()
spy>> OK
                
spy>> Connection[1].close()
spy>> OK

结束语

本文展示了如何使用 DataDirect Spy for JDBC 来配置 IBM Change Data Capture,以便跟踪 JDBC 调用。

致谢

作者衷心感谢他的同事 Glen Sakuth、Elaine Pang、Alec Beaton、Xu Lin、Sunil Kumar Perla 和 Shailesh Jamloki 对本文的审查,以及提供了有助于改进本文的宝贵反馈意见。

参考资料

学习

获得产品和技术

  • 使用 IBM 产品评估试用版软件 构建您的下一个开发项目,可直接从 developerWorks 下载。
  • 现在您可以免费使用 DB2。下载 IBM 软件下载:IBM DB2 Express-C 10.1,这是一个为社区提供的 DB2 Express Edition 免费版本,提供了与 DB2 Express Edition 相同的核心数据功能,并且为构建和部署应用程序提供了坚实基础。

讨论

  • 查看 developerWorks 博客 并加入 developerWorks 中文社区,developerWorks 社区是一个面向全球 IT 专业人员,可以提供博客、书签、wiki、群组、联系、共享和协作等社区功能的专业社交网络社区。

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management
ArticleID=839487
ArticleTitle=InfoSphere Change Data Capture 与 DataDirect Spy for JDBC
publish-date=10082012