3 测试程序的设计与实现
TPC官方提供了一些强制使用的代码和测试程序实现方法和规则的文档,图3给出了官方提供的测试实现样例总览图,每一种颜色代表的意义和上面提到的相同。
依据该图,将测试程序分三个部分来实现:TPCEDriver客户端程序、CEServer应用服务器程序和MEEServer应用服务器程序。TPCEDriver客户端程序模拟客户操作,负责产生随机事务信息并发送到CEServer服务器程序和MEEServer服务器程序,此外,还要传送TMEEIndexTable结构体给CEServer,里面保存了一组或多组TPCEDriver客户端的“主机名”和“端口号”,CEServer在处理TradeOrder事务时要用到该信息(通常情况下保存是本机的信息);CEServer模拟证券公司操作,执行CCE对象和CDM对象产生的事务,并返回输出信息,对于TradeOrder事务的处理比较特殊,不仅要返回输出信息,还要根据执行结果产生TradeRequest信息,然后根据TMEEIndexTable结构体中指定的地址,将它发送出去,由TPCEDriver客户端程序接收处理(用于CMEE对象产生随机事务);MEEServer模拟交易所操作,负责处理CMEE对象产生的事务,并返回输出信息。

图3 TPC-E测试实现样例总览图
3.1 TPCEDriver客户端程序
TPCEDriver客户端程序的功能逻辑主要包括如下几点:
(1)建立CCE、CMEE和CDM对象;
(2)继承CCESUTInterface、CMEESUTInterface和CDMSUTInterface类,名为CSUTInstance,该继承类负责把CCE、CMEE和CDM对象产生的随机事务信息结构体保存到特定的队列中;
(3)定义队列结构体SUTQueue,建立一个或多个队列,要求是FIFO(先进先出)类型;
(4)将指定的CSUTInsance对象与SUTQueue队列对象进行关联;
(5)将指定的CCE、CMEE或CDM对象与CSUTInsance对象进行关联;
(6)调用CDM对象的DoCleanupTxn()产生一个TradeCleanup事务信息结构体,发送到应用服务器执行,取消或中止所有未执行完的事务,也可以不执行;
(7)建立网络监听服务线程,负责接收CEServer执行TradeOrder事务返回的TradeRequest信息(用于CMEE对象),并保存到辅助队列中;
(8)建立CCE、CMEE和CDM对象的模拟驱动线程,源源不断的产生随机事务信息,并保存到特定的队列中;
(9)建立事务发送线程,从指定队列中获取随机事务信息结构体,并发送给CEServer或MEEServer;至于接收返回信息的过程,有同步和异步两种模式:使用同步模式时,事务发送线程会等待,直到发送的事务接收到返回信息,才继续发送下一个事务;使用异步模式时,事务发送线程不等待,直接发送下一个事务。为了减少建立接收返回信息线程的数量,提高网络通讯性能,并且方便统一管理,本测试程序中对于网络接收过程都调用了统一的完成端口模型;
(10)每秒统计一次执行结果,输出波形图,显示统计结果。
注意事项:
(1)CMEE对象依赖于CCE对象产生的TradeOrder事务的返回信息,只有当CCE对象产生的TradeOrder事务被执行后,将CEServer应用服务器发送的TradeRequest信息传递给CMEE对象的SubmitTradeRequest( PTradeRequest pTradeRequest ) 函数接口,才能产生新的MEE事务信息;另外,CDM对象每分钟只能产生一个Data-Maintenance(数据维护事务),而且要求必须在55秒内执行完毕。
(2)每个事务模拟类CCE、CMEE和CDM的对象只能对应一个事务队列;每个事务队列都是FIFO类型的;每个事务发送线程必须总是从同一个事务队列中取事务。
图4显示了TPCEDriver的驱动模型图:

图4 TPCEDriver驱动模型图
3.2 CEServer和MEEServer应用服务器程序
CEServer和MEEServer程序已经由微软公司提供,由于这两个程序是微软公司专门为SQL Server 2005数据库管理系统开发的,所以还需要修改数据库连接(ODBC方式)和操作的部分,以适应其他的数据库管理系统。

图5 CEServer执行Broker-Volume事务流程图
图5给出了CEServer程序执行Broker-Volume事务的流程图,CBaseServer是CCEServer和CMEEServer的基类,通过调用ListenAndDispatchThread(void *ptr)函数接口来进行网络监听,并为每一个新的连接建立单独的线程进行处理,具体的处理过程为:
(1)调用CCEServer的TCEServerLocals* CCEServer::InitializeLocal()接口来创建单独的TCEServerLocals结构体,初始化结构体中的相关对象:
CDBConnection m_DBConnection;
CBrokerVolumeDB m_dbBV;
CBrokerVolume m_BV;
其他事务对象没有列举出来;
(2)接收到一个完整的事务消息后,分析其事务类型,然后转到相应的事务类进行处理,对于Broker-Volume事务,调用CBrokerVolume类的函数接口void DoTxn( PBrokerVolumeTxnInput pTxnInput, PBrokerVolumeTxnOutput pTxnOutput )来执行事务;
(3) CBrokerVolume类的DoTxn函数接口中,会调用其CBrokerVolumeDB对象成员去执行具体的每一个事务帧;
(4) CBrokerVolumeDB类中具有CDBConnection对象成员,可以通过它进行数据库连接,提交事务或回滚事务等操作,具体执行SQL语句并分配语句句柄和段句柄的操作还是由CBrokerVolumeDB类实现。
至于其他事务的处理以及MEEServer的运行流程,和上面介绍的内容基本相似,这里就不在赘述。
4 总结
通过本文的介绍,希望能使读者了解TPC-E测试程序的系统架构和实现原理,当然,由于笔者水平有限,某些TPC-E官方文档中的英文术语可能翻译的不够准确,或者理解的不够透彻,如有不足之处,欢迎批评指正。
作者:龙涛(flybird_lt@yahoo.com.cn)
原文链接:http://blog.csdn.net/flybird_lt/archive/2008/03/20/2200447.aspx