一种联机事务处理系统中间件的封装方法

文档序号:6557285阅读:238来源:国知局
专利名称:一种联机事务处理系统中间件的封装方法
技术领域
本发明涉及计算机系统技术领域,具体涉及一种联机事务处理系统中间件的封装方法。

背景技术
现有的OLTP(On Line Transaction Processing,联机事务处理)系统一般分为两层模式和三层模式。在两层模式OLTP系统中客户机直接跟数据库交互,解决实际的业务问题。通常是应用程序直接建立到数据库服务器的连接,并在此连接上完成业务需要的数据操作。两层模式的OLTP系统如图1所示,两层模式的OLTP系统能很好的支持并发度要求小的业务处理系统,适合规模不大的OLTP系统。随着信息系统的普及,大公司、大企业的业务扩张使数据的并发访问量越来越大,需要的数据库服务器处理能力越来越强,网络上数据传输量也越来越大,主机性能和网络带宽成为业务发展的瓶颈,除了采购更好、更多的硬件以外,三层模式的OLTP系统成为一种最佳选择。三层模式的OLTP系统如图2所示,三层模式OLTP系统将客户机与数据隔离,客户机不再直接访问数据,而是通过应用服务器来访问数据,由应用服务器建立数据库连接,只要建立比客户机个数小的多的应用服务器到数据库的连接个数就可以完全达到两层模式OLTP系统的效果;同时跟数据密切相关的业务逻辑也自然地从客户机移到应用服务器,使得业务处理过程和客户机完全分离,通过网络传输的数据量大大减少,网络带宽的问题得到缓解。三层模式使得OLTP系统的开发效率更高,维护更方便,扩展和应用部署更具有弹性,安全性也得到了增强。通常实现的大业务量三层模式OLTP系统都是基于中间件构建的,由中间件在客户机和数据之间架起数据存取的桥梁,并提供业务逻辑实现的应用框架(通常是应用服务器)。客户机和应用服务器之间使用的是私有应用开发接口协议,因此造成不同厂家开发的中间件并不相同,而且私有应用开发接口协议提供的客户机和应用服务器之间的数据交换方式也不相同,这给应用开发带来了很大的麻烦。
现有技术的OLTP中间件,对应用服务器长时间的事务处理以及应用服务器跟客户机之间的大数据量传递,都没有提供好的解决办法,有的中间件提供一个原始的应用开发接口,此接口通过一个数据结构在客户机和应用服务器之间进行通信,不同的功能采用不同的命令字来区分,并且客户机和应用服务器之间传递的业务数据一般每次不能超过32K字节,应用开发极其困难。有的中间件在原始接口之上提供简易的封装,但有很多限制。例如提供一套涵盖原始开发接口的C语言API(Application Program Interface,应用程序接口)封装和在此API之上的一个C++类封装;采用字符串作为底层数据传递的基本数据类型,对二进制流的传递要进行转意操作,即要首先将二进制数据转换成字符串,然后才能进行传输;业务数据按照“名=值“的方式进行打包封装传递;支持超过32K的业务数据传递,采用的是临时存储队列作为底层技术。前面所说的方案本质上是中间件原始应用开发接口的一套薄封装,业务开发人员要懂中间件技术;对二进制数据的数据支持不够,因为要进行转意操作两次,并且要逐个检查,效率低下;对超过32K的业务数据的支持不够,使用的是基于文件系统的临时队列,效率低下;对超过32K的业务数据的夸域调用支持不够,需要进行大量烦琐的操作和配置;没有对开发人员进行中间件技术的隔离,要求开发人员必须掌握底层中间件技术,对业务开发人员要求较高,开发效率低下。


发明内容
本发明要解决的技术问题是提供一种联机事务处理系统中间件的封装方法,克服现有技术要求联机事务处理系统的开发人员必须掌握中间件技术的缺点,以及现有技术的应用中间件技术的联机事务处理系统数据传递效率低下和缺乏通用高效的大数据量传递手段的缺点。
本发明采用如下的技术方案 一种联机事务处理系统中间件的封装方法,包括步骤建立业务处理类基类,用业务处理类基类中的数据成员和成员函数的参数表征中间件处理的数据类型,业务处理类基类中的成员函数调用中间件的应用程序接口,实现联机事务处理系统中间件的数据处理功能。
所述的联机事务处理系统中间件的封装方法,其中建立业务实体类基类,由业务实体类基类中的不同成员函数对对象进行序列化和反序列化。
所述的联机事务处理系统中间件的封装方法,其中建立一个根基类,由根基类派生业务处理类基类和业务实体类基类。
所述的联机事务处理系统中间件的封装方法,其中业务处理类基类派生至少一个业务处理类,由业务处理类中的成员函数对联机事务处理系统中间件的功能进行封装。
所述的联机事务处理系统中间件的封装方法,其中业务实体类基类派生至少一个业务实体类,由业务实体类中的成员函数对对象进行序列化和反序列化。
所述的联机事务处理系统中间件的封装方法,其中在业务处理类基类中定义对联机事务处理系统中间件的功能进行封装的纯虚函数,由业务处理类中的成员函数对联机事务处理系统中间件的功能进行封装。
所述的联机事务处理系统中间件的封装方法,其中在业务实体类基类中定义对对象进行序列化和反序列化的纯虚函数,由业务实体类中的成员函数对对象进行序列化和反序列化。
所述的联机事务处理系统中间件的封装方法,其中建立一个对象序列化类,业务实体类基类或者业务实体类调用对象序列化类的成员函数对对象进行序列化和反序列化。
所述的联机事务处理系统中间件的封装方法,其中,构造宏来动态创建类和相应的类对象第一宏将类名和创建类对象的方法声明到类中;第二宏实现类声明中的方法,并将类名和类对象的创建方法注册到类工厂中;第三宏根据类名从类工厂中获得类的对象创建方法,并返回一个类对象。
所述的联机事务处理系统中间件的封装方法,其中定义和构造一对全局函数,用于数据传输时的数据压缩和数据解压缩。
所述的联机事务处理系统中间件的封装方法,其中定义和构造一对全局函数,用于数据传输时的数据加密和数据解密。
所述的联机事务处理系统中间件的封装方法,其中定义和构造一个全局函数,用于客户机到服务器的大数据量上传。
所述的联机事务处理系统中间件的封装方法,其中定义和构造一个全局函数,用于服务器到客户机的大数据量下载。
本发明的技术方案通过提供一套业务实体类和业务处理类体系、对象序列化机制和动态创建类对象的方法,使用二进制流进行数据传递,提供对任何类型数据的传递支持,业务开发人员可以对业务数据进行自主的序列化和反序列化操作,克服了中间件不能支持任意数据类型的缺点,并且业务处理可以根据业务类型进行灵活定制;通过提供一套基于中间件底层功能的封装,克服了了业务开发人员必须了解中间件技术的缺点;通过将数据上传和下载分离,提供一套高效的、基于共享内存的、客户机和服务器间的大数据量传递方法,有效解决了大数据量事务的超时问题和中间件每次服务调用对数据量的大小进行限制的缺点。



本发明包括如下附图 图1是现有技术两层模式OLTP系统示意图; 图2是现有技术三层模式OLTP系统示意图; 图3是本发明对OLTP中间件进行封装的模块示意图; 图4是本发明的类继承关系图; 图5是本发明通过客户端封装和服务器端封装进行数据上传和下载流程示意图。

具体实施例方式 下面结合附图和实施例对本发明作进一步详细说明 本发明采用面向对象技术,利用类的数据成员和成员函数对中间件的功能进行封装,如图4所示,所有的类有一个共同的基类CPObject,此基类派生出业务实体类基类CPEntity和业务处理类基类CBusinessProcess,再由业务实体类基类CPEntity派生出业务需要的相应的业务实体类,业务处理类基类CBusinessProcess派生出所有的业务处理类;整个类体系支持按名创建类对象;业务实体类实现序列化和反序列化方法;业务处理类实现Execute虚方法;业务实体类用来在客户机和服务器之间进行业务数据传递;业务处理类用来实现业务处理过程。
动态创建类机制由三个宏来实现 1、宏DECLARE_OBJ_DYNCREATE(类名),将类名和创建类对象的方法声明到类中; 下面是定义上述宏的实例 #define DECLARE_OBJ_DYNCREATE(class_name)\ public:\ static CPObject*Create##class_name(); 2、宏IMPLEMENT_OBJ_DYNCREATE(类名),将类声明中的方法进行实现,并将类名和类对象的创建方法注册到类工厂中; 下面是定义上述宏的实例 #define IMPLEMENT_OBJ_DYNCREATE(class_name)\ CPObject*class_name::Create##class_name()\ {\return(CPObject*)(new class_name());\ }\ staticint volatile gTmp##class_name=\ RegisterCreateMethod(#class_name,class_name::Create##class_name); 3、宏CREATE_OBJECT(类名),根据类名从类工厂中获得类的对象创建方法,并返回一个类对象; 下面是定义上述宏的实例 #define CREATE_OBJECT(class_name)CreateObjectByName(class_name) 在上面的宏定义中使用了两个全局的方法RegisterCreateMethod和CreateObjectByName RegisterCreateMethod(#class_name,class_name::Create##class_name) 方法使用C++的机制将类名(#class_name)和该类对象的创建方法(class_name::Create##class_name)建立对应关系,并保存到一个数组或者map中; CreateObjectByName(class_name)方法根据类名(class_name),找到其对应的创建对象的方法,然后创建一个该类的对象并返回该对象。
对象序列化类,完成类对象的序列化和反序列化。客户机和服务器之间进行通讯是要交换数据的,在网络层数据都是以二进制字节流的方式传递的,但是面向用户和编程人员的数据是通常的数据格式,如十进制、字符串等。在此提供的对象序列化类,就是将用户可读的对象级的数据转化成适合网络传输的二进制字节流(对象序列化)并在接收到的二进制字节流转化成用户可读的对象级数据(对象反序列化)。
对象序列化类提供的典型数据和方法如下 表1给出了典型数据成员及命名 表1 表2给出了基本数据类型的处理方法及命名 表2 表3给出了用户自己定义数据类型的序列化和命名 表3 假设上面的对象序列化类为CObArchive,自己定义的数据类型的基类至少要有如下所示的二个虚方法 class CPEntity:public CPObject { public: virtual void Save(CObjectArchive&)=0; virtual void Load(CObArchive&)=0; }; 现在可以定义自己的一种数据类型,如CUserInfo,定义如下 class CUserInfo:public CPEntity { public: void Save(CObjectArchive&); void Load(CObArchive&); }; 在实现文件里实现Save、Load方法,它们分别对自己类中需要的传递的基本数据进行Save、Load操作。
客户机封装和服务器封装 基于中间件底层技术(私有的应用协议)提供一套业务接口协议IuniCall。将中间件技术与业务实现进行隔离,其中客户机封装使用原中间件私有协议的底层API(应用程序接口)并对客户机提供一套面向业务的接口。该接口对业务的输入数据和输出数据进行包装,数据包装使用CObArchive类进行序列化处理,只要准备好输入数据,调用业务处理接口,就会根据业务处理情况返回相应的处理结果。服务器封装也是使用原中间件私有协议的底层API并对服务器提供一套面向业务的接口框架。客户机封装和服务器封装的示意图如图3所示。这样在客户机上进行业务开发使用的是客户机封装接口,在服务器上进行业务开发使用的是服务器封装接口框架。
客户机封装接口类的主要方法如下 class IUniCall { public: void Invoke(CIntRequest &req,CIntResponse &resp,int timeout=TX_TIMEOUT); virtual bool GetRouteInfo(CIntRequest&req,TX_CALLINFO&info)=0; }; 在该类中定义GetRouteInfo和Invoke方法,下面解析如下 CIntRequest输入数据的封装,是从CPEntity派生,实现了Load、Save方法,数据成员由标准数据成员和输入参数构成。典型的成员如下 子系统类型请求发起子系统的标识, 命令类型要处理的业务类型, 命令字业务分支, 业务对象标识业务相关的处理对象标识, 事务标识是否要求事务处理, 输入参数对象数组所有的输入业务数据对象,都从CPEntity派生。
CIntResponse返回结果数据的封装,是从CPEntity派生,实现了Load、Save方法,数据成员由标准数据成员和输出参数数组构成。典型的成员如下 返回代码标识请求的处理情况, 返回结果数组所有返回的业务数据对象,都从CPEntity派生, GetRouteInfo根据输入数据中的相关信息,取得相应的路由信息,决定请求发送到那个服务器进行处理。业务人员可以根据自己的需要确定路由方案。
Invoke将业务请求发送到相应的服务器,其中CIntRequest含有输入数据,返回结果在CIntResponse中带回来。内部实现是将CInRequest对象调用CObArchive对象进行序列化,然后调用中间件底层API将数据传递到服务器端,服务器端处理后将结果(字节流)返回来,客户端再进行反序列化生成CIntResponse对象,其中CIntRequest和CIntResponse是输入参数和输出参数的封装。
下面是客户端代码实例 //......略...... CIntRequest req; CIntResponse resp; req.m_inParams.Add(参数1); req.m_inParams.Add(参数2); //......略...... req.m_inParams.Add(参数n); CBkUniCall bk try { bk.Invoke(req,resp); //正确处理 //......略...... }catch(...) {//错误处理 //......略...... } 其中CbkUniCall是从IuniCall派生出来的类,实现了GetRouteInfo方法。
在服务器端,针对不同的中间件给出一个相同的应用框架,并提供一个业务嵌入的接口,断开业务实现和中间件技术的联系。
业务类体系 class CPObject; //业务处理类基类 class CBusinessProcesspublic CPObject { public:virtual void Execute(CIntRequest&req,CIntResponse&resp)=0; }; 可以看出此基类的形参跟客户机接口的完全一样,这种透明性达到了业务与中间件技术隔离的目的。
服务框架 通过抽象一个标准的接受请求接口,形式如下 void ProcessRequest(char*data,int datalen);来达到统一中间件接受请求的目的。
通过抽像一个标准的数据返回接口,形式如下 void ReturnResponse(char*data,int datalen);来达到统一中间件结果返回的目的。
通过实现一个根据类名称创建类对象的机制,形式如下 IBossProcess*GetProcessObject(CintRequest&req);达到服务器框架对应用的透明的目的。
下面是框架的代码实例 服务入口函数 { //......略...... ProcessRequest(data,datalen); //......略...... } void ProcessRequest(char*rqstdata,int rqstdatalen) { //......略...... CIntRequest req; CIntResponse resp; CBusinessProcess*process=0; char*rspdata=0; int rspdatalen=0; DecodePkg(rqstdata,rqstdatalen,&req); process=GetProcessObject(req); process->Execute(req,resp); //......略...... EncodePkg(rspdata,rspdatalen,resp); ReturnResponse(rspdata,rspdatalen); //......略...... } 客户机传输机制和服务器传输机制 在客户机将业务请求发送到服务器和服务器将处理结果返回到客户机时,但业务数据很大时,有些中间件产品对数据大小有限制,如限制每次交互的所有数据不能超过32K。通过提供统一的数据传递机制,实现大数据的传输和统一业务开发接口。
如图5所示,对于客户机一侧,如果业务数据大小没有超过限制,则直接将业务数据发送到服务器端;如果业务数据超过限制,则通过调用在中间件上发布的两个服务函数UpLoadData和DownLoadData来实现业务数据的上传和下载。UpLoadData服务函数将业务请求数据从客户机上载到服务器一侧,DownLoadData服务函数将服务器侧的返回结果下载到客户机。在客户机将业务数据上传到服务器时,第一次将生成一个数据上传会话标识,直到数据全部上传完毕,最后客户机使用此数据标识调用业务服务。
上传数据过程当客户机准备好业务数据对象发起业务调用时,客户端封装截获业务请求,将对数据对象施加序列化机制,形成一个二进制数据流,并给出数据长度,然后开始数据上传过程,在数据上传以前,可以对数据进行压缩,加密等操作。上传过程中,如果数据长度大于规定的长度,我们就在立即启用一个会话生成一个会话标识,在第一次调用数据上载服务时,将会话标识和数据内容和发送的数据长度,总的数据长度发送到对侧,服务端封装接收到后将数据按照会话标识保持在服务器端,一直将数据发送完毕。数据发送完成以后,发起业务服务调用,此时将会话标识传递到服务器侧,此标识就是数据的标识.服务器侧就可以根据会话标识取得刚才上传的数据进行业务处理.数据上传过程结束。
对于服务器一侧,如果业务数据大小没有超过限制,则直接将业务数据返回给客户端。如果业务数据超过限制,则首先将业务数据存放到本地的共享内存中,并且分配一个唯一的标识,服务器将这个标识返回给客户端,客户端根据此标识调用DownLoadData服务函数将业务数据分批下载下来。
数据下载过程只是将服务器变成了数据的发送端,客户机变成了数据接收端,就是说当服务器侧返回的业务数据大于规定的量时,服务端封装会在服务器侧将数据先存起来,然后服务器生成一个会话标识,返回给客户机,客户机根据此会话标识,向服务器侧发起下载服务调用,将数据取到客户机侧,一直数据完全取得客户端为止。
传输过程的压缩/解压缩与加密/解密 现在加密/解密、压缩/界压缩的算法多种多样,在我们的封装中所有要传递的数据对象都是经过CObArchive来序列化和反序列化的,然后在网络上传送,由于要传递的数据是个二进制的流,在数据通过网络传送以前可以对数据进行加密/压缩等算法操作,保证数据传递的安全和高效,在接收到数据时可以对数据进行解密/解压缩,进行数据还原。
提供下面四个全局函数 void Compress(unsigned char*indata,size_t inlen, unsigned char*&outdata,size_t&outlen); 函数功能将给定的长度的数据进行压缩后返回压缩后的数据和长度; Indata输入缓存区,指向要压缩的数据开始地址; inlen需要压缩的数据的长度(字节数); outdata经过压缩后返回的数据的缓冲区开始地址; outlen压缩后数据的长度; void Uncompress(unsigned char*indata,size_t inlen,unsigned char*&outdata,size_t&outlen); 函数功能将给定长度的压缩数据进行解压缩后返回解压缩后的数据和长度; indata输入缓存区,指向要解压缩的数据开始地址; inlen需要解压缩的数据的长度(字节数); outdata经过解压后返回的数据的缓冲区开始地址; outlen解压缩后数据的长度; void Encrypt(unsigned char*indata,size_t inlen, unsigned char*&outdata,size_t&outlen); 函数功能将给定长度的数据进行加密返回加密后的数据和长度; indata输入缓存区,指向要解加密的数据开始地址; inlen需要加密的数据的长度(字节数); outdata经过加密后返回的数据的缓冲区开始地址; outlen加密后数据的长度; void Unencrypt(unsigned char*indata,size_t inlen,unsigned char*&outdata,size_t&outlen); 函数功能将给定长度的加密的数据进行解密后返回的解密后的数据和长度; indata输入缓存区,指向要解密的数据开始地址; inlen需要解密的数据的长度(字节数); outdata经过解密后返回的数据的缓冲区开始地址; outlen解密后数据的长度; 在要传递的数据对象经过序列化,要发送出去的时候,此时已经有了要发送的数据(indata)和长度(inlen),我们就可以施加压缩和加密算法得到数据(outdata)和长度(outlen),然后将outdata和outlen发送出去,实施例代码如下 ... //首先将indata压缩到outdata1 Compress(indata,inlen,outdata1,outlen1); //再将outdata1加密到outdata Encrypt(outdata1,outlen1,outdata,outlen); //然后将outdata,outlen发送出去 ... 在接收侧收到数据(outdata,outlen)以后,进行数据还原(这里要求是压缩和加密的逆过程),实施例代码如下 ... //将接收到的数据outdata,长度outlen,进行解密输出indata1和inlen1 Unencrypt(outdata,outlen,indata1,inlen1); //将解密后的数据indata1,长度inlen1,进行解压缩输出indata和inlen Uncompress(indata1,inlen1,indata,inlen); //此时数据indata就是数据对象经过序列化后的数据,inlen就是数//据长度,就可以进行反序列化操作了 ... 本发明技术方案的有益效果屏蔽了业务开发人员对中间件技术的技能要求,使得业务开发人员更专注业务的实现;提高了开发速度降低了开发难度;统一了不同中间件的接口,使得应用可以简单地跨中间件平台,而不需要业务代码的更改,提高了应用系统的部署灵活性;提供了统一的数据传递机制,为跨中间件平台提供了更进一步的保障,提高了系统的适应性。
虽然通过参照本发明的优选实施例,已经对本发明进行了图示和描述,但本领域的普通技术人员应该明白,可以在形式上和细节上对其作各种各样的改变,而不偏离所附权利要求书所限定的本发明的精神和范围。
权利要求
1.一种联机事务处理系统中间件的封装方法,其特征在于,包括步骤建立业务处理类基类,用业务处理类基类中的数据成员和成员函数的参数表征中间件处理的数据类型,业务处理类基类中的成员函数调用中间件的应用程序接口,实现联机事务处理系统中间件的数据处理功能。
2.根据权利要求1所述的联机事务处理系统中间件的封装方法,其特征在于建立业务实体类基类,由业务实体类基类中的不同成员函数对对象进行序列化和反序列化。
3.根据权利要求2所述的联机事务处理系统中间件的封装方法,其特征在于建立一个根基类,由根基类派生业务处理类基类和业务实体类基类。
4.根据权利要求3所述的联机事务处理系统中间件的封装方法,其特征在于业务处理类基类派生至少一个业务处理类,由业务处理类中的成员函数对联机事务处理系统中间件的功能进行封装。
5.根据权利要求4所述的联机事务处理系统中间件的封装方法,其特征在于业务实体类基类派生至少一个业务实体类,由业务实体类中的成员函数对对象进行序列化和反序列化。
6.根据权利要求5所述的联机事务处理系统中间件的封装方法,其特征在于在业务处理类基类中定义对联机事务处理系统中间件的功能进行封装的纯虚函数,由业务处理类中的成员函数对联机事务处理系统中间件的功能进行封装。
7.根据权利要求6所述的联机事务处理系统中间件的封装方法,其特征在于在业务实体类基类中定义对对象进行序列化和反序列化的纯虚函数,由业务实体类中的成员函数对对象进行序列化和反序列化。
8.根据权利要求7所述的联机事务处理系统中间件的封装方法,其特征在于建立一个对象序列化类,业务实体类基类或者业务实体类调用对象序列化类的成员函数对对象进行序列化和反序列化。
9.根据权利要求8所述的联机事务处理系统中间件的封装方法,其特征在于,构造宏来动态创建类和相应的类对象第一宏将类名和创建类对象的方法声明到类中;第二宏实现类声明中的方法,并将类名和类对象的创建方法注册到类工厂中;第三宏根据类名从类工厂中获得类的对象创建方法,并返回一个类对象。
10.根据权利要求9所述的联机事务处理系统中间件的封装方法,其特征在于定义和构造一对全局函数,用于数据传输时的数据压缩和数据解压缩。
11.根据权利要求1至10任一所述的联机事务处理系统中间件的封装方法,其特征在于定义和构造一对全局函数,用于数据传输时的数据加密和数据解密。
12.根据权利要求11所述的联机事务处理系统中间件的封装方法,其特征在于定义和构造一个全局函数,用于客户机到服务器的大数据量上传。
13.根据权利要求12所述的联机事务处理系统中间件的封装方法,其特征在于定义和构造一个全局函数,用于服务器到客户机的大数据量下载。
全文摘要
本发明公开了一种联机事务处理系统中间件的封装方法,包括步骤建立业务处理类基类,用业务处理类基类中的数据成员和成员函数的参数表征中间件处理的数据类型,业务处理类基类中的成员函数调用中间件的应用程序接口,实现联机事务处理系统中间件的数据处理功能;建立业务实体类基类,由业务实体类基类中的不同成员函数对对象进行序列化和反序列化;建立一个根基类,由根基类派生业务处理类基类和业务实体类基类;业务处理类基类派生至少一个业务处理类,由业务处理类中的成员函数对联机事务处理系统中间件的功能进行封装;业务实体类基类派生至少一个业务实体类,由业务实体类中的成员函数对对象进行序列化和反序列化。
文档编号G06F17/30GK101122852SQ20061006204
公开日2008年2月13日 申请日期2006年8月8日 优先权日2006年8月8日
发明者姜琰祥 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1