本文将对一款 XML 数据库事务处理性能测试工具 TPoX 进行介绍。它对数据库处理 XML 事务的整体能力进行性能测试 , 不同于其他测试工具仅对 XQuery 执行效率进行测试。 TPoX 的部分测试数据来源于金融领域的实际情景 , 并且具有一定的仿真性。
前言
XML 数据库是近年来新出现的支持 XML 功能操作的数据库。各种 XML 数据库良莠不齐,用户对 XML 数据库的需求也不尽相同。性能,无疑是是大多数用户的首要挑选条件。因此,各种各样的性能测试工具应运而生,XMach-1,XPathMark,XBench 等等。但是这些测试工具仅针对数据库的某个方面进行测试,如 XQuery 的查询性能等。本文将为大家介绍一款针对于 XML 数据库的整体事务处理能力进行测试的工具—— TPoX,Transaction Processing over XML 。
TPoX 概述
TPoX 是一款基于金融场景的针对 XML 数据库的性能基准测试工具。它主要用来评估 XML 数据库的以下性能:XQuery,SQL/XML, XML 存储 , XML 索引, XML Schema 验证, XML 更新,并发操作等。 TPoX 由负载驱动程序,测试用 XML Schema,测试用 XML 数据,示例负载描述文件和事务模板组成。
现介绍如下:
- XML schema:定义了该测试所用 XML 数据,包括一个 FIXML 的 schema ;
- 数据生成工具:可以生成该测试所用的数据;
- 示例负载描述文件和事务模板:这两者组成了测试用负载,它包括一系列的事务,事务可以包括 XQuery,insert,update 等操作,这些事务将被执行在生成的数据上;
- 负载驱动程序:Java 应用程序,用来执行用户定义的负载,并且收集和打印测试结果;可以通过配置文件定制模拟的并发用户数量;此外,它最大的特点是每次执行的事务都可以通过 Parameter Maker 来动态的生成随机测试数据;
- 文档:描述 TPoX 的实现细节及使用方法的文档。
数据模型
TPoX 的数据模型是基于金融系统中的交易场景。它包括 2 个业务实体:客户和经纪行(如下图所示)。客户通过订单 Order 来买卖证券,经纪行根据客户的请求来处理交易。该系统的核心便是一个支持 XML 功能的数据库,它的性能决定了该应用的性能。
图 1. 交易场景
下图显示了 TPoX 的主要逻辑数据实体关系以及其对应的 schema 。每个客户 Customer 有 1 或多个账户 Account,每个账户 Account 可以下 1 或多个订单 Order,每个订单 Order 每次可以买或者卖 1 个权证 Security,每个权证 Security 可以有 1 或多个持有 Holding,就是说该权证可以被多个账户购买;同理,每个账户 Account 可以包括 1 或多个持有 Holding 。每一个权证 Security 可以存在于 Customer 的多个订单 Order 或者持有 Holding 里。
图 2. 实体关系
事务模板
TPoX 的测试方式是执行用户指定的事务。 TPoX 提供了一些基本的事务模板,他们存放在 TPoX/WorkloadDriver/DB2/ 下,用户可以修改或者增加所需执行的事务。同一个事务应当放在同一个文件中,它应该由一条或者多条增删改查语句组成。每条语句应当由 % 作为结束符。负载驱动会在每个文件的最后一条语句执行完后提交 commit,除非该事务中有 commit 语句。
事务模板可以包含参数 Parameter,如下所示,其中包括像“ |1 ” 这样的参数,该参数的生成规则由负载描述文件提供,在执行测试中由 Parameter Maker 生成。
清单 1. 示例模板
declare default element namespace "http://tpoxbenchmark. com/custacc"; for $cust in db2-fn:xmlcolumn("CUSTACC.CADOC")/Customer where $cust/@id=|1 and $cust/Nationality="|2" return <Customer_Profile CUSTOMERID="{$cust/@id}"> {$cust/Name} {$cust/DateOfBirth} {$cust/Gender} {$cust/Nationality} {$cust/Addresses} {$cust/EmailAddresses} </Customer_Profile> % |
负载描述文件
负载描述文件用来控制负载驱动的执行,它告诉负载驱动去执行配置的事务以及如何实现其中的参数。一些示例负载描述文件位于 TPoX/WorkloadDriver/properties 。负载描述文件可以指定一个包含模板的目录或者显式地指出所要执行的模板列表。
清单 2. 负载描述文件示例
numOfTransactions = 4 t1 = myqueries/listSecurities.xqr w1 = 50 p1|1 = file|input/security_types.txt t2 = myqueries/getCustomerProfile.xqr w2 = 20 p2|1 = uniform|2000-4000 p2|2 = uniform|5000-20000 t3 = myqueries/listOrders.xqr w3 = 15 t4 = myqueries/customized.xqr w4 = 15 |
- numOfTransactions 指定该模板中包含的事务数量。上例中这个负载包含 4 个事务,它们位于 TPoX/WorkloadDriver/myqueries/ 目录下;该路径可以是绝对路径,也可以是相对于 WorkloadDriver 的相对路径;
- t1 为模板的名字,w1 为该事务的权值,如果有一个权值被指定,那么所有的事务都应该分配权值,并且所有权值相加应当为 100,否则报错;权值的作用在于,如果用户指定此次测试时间为 100s,那么在此负载下,t1 会被执行 50% 即 50s ;
- p1 为事务 t1 中的参数 parameter 的生成规则,parameter maker 会在测试执行过程中跟据该规则生成具体的数值,其中 p1|1 表示第一个事务的第一个参数,p2|1 表示第二个事务的第一个参数,p2|2 为第二个事务中的第二个参数。 p1|1 表明,第 1 个参数从文件 File 中随机抽取,“ | ”后为该文件的地址; p2|1 表明,事务 2 的第 1 个参数随机取自整型 Integer 的均匀分布,分布从 2000 到 4000,假如第二个事务中有条语句是“ ... where $doc/num = |1 ”, 则“ |1 ”会被 2000-4000 中的一个随机数代替。
使用 TPoX
1. 安装 TPoX
首先,登录http://tpox.sourceforge.net/下载最新的 TPoX 。
解压后,我们首先来看下 TPoX 的文件夹结构:
清单 3. 文件夹结构
TPoX ------------------------------ datagen DB2 documentation generatedXML MSSQL Oracle sample_documents schemas toxgene WorkloadDriver |
- datagen:测试数据生成工具;
- DB2,MSSQL,Oracle:用来测试特定数据库的相关文件;
- generatedXML:用来存放生成的 XML 文件的目录;
- schemas:测试所用的 schema 文件;
- WorkloadDriver:负载驱动文件夹,TPoX 的主程序所在;
然后,登录 http://www.ibiblio.org/maven/commons-cli/jars/ 下载负载驱动程序的库文件 commons-cli-1.0.jar, 并且将它放在 TPoX/WorkloadDriver/plugins/ 下。
最后,需要修复 Windows 和 Linux 不同回车符的问题,执行以下命令:
清单 4. 修复命令
cd TPoX/ chmod a+x fix chmod a+x fixAll ./fixAll |
2. 准备测试数据
2.1 下载测试数据
在 http://tpox.sourceforge.net/ 下载测试数据,这些测试数据是由 datagen 按照 XXS(最小)的标准生成的。如果你需要更大的测试数据,请单独运行 datagen 来生成符合你条件的测试数据。生成数据方法请参阅 2.2 。
解压后,将数据拷贝到 generatedXML 目录,如下所示:
TPoX/generatedXML/XXS/custacc/batch-[1-7] TPoX/generatedXML/XXS/order/batch-[1-7] TPoX/generatedXML/XXS/security TPoX/generatedXML/XXS/account/batch-1 |