一种统一访问数据库系统的方法

文档序号:6575113阅读:367来源:国知局
专利名称:一种统一访问数据库系统的方法
技术领域
本发明涉及数据库领域,具体的说,涉及利用统一数据库接口访问各种不同类型数据库的方法。
但是,由于各地的数据库系统不是同时上马,规格制式各不相同;即使是同一个系统的不同地区,也是花样百出,对数据库的访问方法也不尽相同。这种状态极大影响了整个数据库系统的正常协调运作,工作效率低下,严重时,甚至造成整个数据库系统的瘫痪。
特别值得一提的是,由于移动通讯技术日臻成熟,带来各种增值业务不断扩展,其中尤为引人注目的短消息增长迅速,每年的短消息业务量已达数百亿条,引发众多运营商争相投入,在短消息系统中,可以应用的商用数据库有多种,如甲骨文公司的ORACLE数据库,美国塞贝斯公司的SYBASE数据库,以及DB2,SQLServer等等,每一种数据库都提供了一种或多种开发高效的数据库应用的编程接口,如ORACLE的OCI(Oracle Call Interface,即ORACLE调用层接口),SYBASE的DB LIB或CT LIB,INFORMIX的CLI和SQL Server的DB Library等,这些编程接口能够方便开发人员对数据库的应用进行程序设计,运行控制更加灵活,开发出访问效率极高的数据库应用方法。但是,由于各商用数据库系统提供的数据库应用接口和使用方法差别很大,如果要将短消息系统的数据库从一种数据库系统(如SYBASE的DB Library)移植到另一种数据库系统(如ORACLE的OCI),则必须重写设置,重新调试,付出的代价相当大。为了克服这一缺点,微软公司推出的ODBC(Open Database Connectivity)标准接口技术可以访问不同类型的数据库,但实测表明,通过ODBC访问数据库的效率要比直接调用各商用数据库系统提供的数据库应用接口的效率低20%--30%,极大地降低了系统的处理能力。由于短消息系统对数据库访问的实时性要求非常高,因此,必须寻找一种通用的数据库访问方法,只需做简单的配置,而不必推倒重来,就可以极高的效率对不同的商用数据库系统进行访问。
目前,尚未检索到论述并解决上述问题的公开文献。
本发明所述的统一数据库接口的实现方法主要是将各数据库系统的底层调用接口(如ORACLE的OCI,SYBASE的DB LIB或CT LIB,INFORMIX的CLI和SQLServer的DB Library等)的功能相同的接口进行封装,为短消息系统提供统一的访问数据库接口及其调用方法,其特征在于1.创建数据库连接池;2.对各数据库系统的底层调用接口按功能进行分类;3.根据分类,封装底层调用接口;4.将封装好的统一数据库接口做成动态库;5.通过数据库进行读或写访问。
与现有技术相比,本发明所述方法由于所封装的接口均为各数据库系统的最高效的底层调用接口,实测表明,效率比采用ODBC技术高出20%~30%,提高了数据库的访问速度,进而极大地提高了系统的处理能力;由于封装了多种数据库系统的底层接口,因此,只需做简单的配置,而不需要修改源代码,也不需重新编译,可直接应用在不同的商用数据库系统中,提高了系统的互连互通性能,大大降低了开发和维护的成本,也极大提高了系统的稳定性。
图2是本发明统一访问数据库系统的方法流程示意图;图3是本发明统一访问数据库系统应用在短消息系统的实施例,实现写数据库的方法流程图;图4是本发明统一访问数据库系统的另一实施例,实现读数据库的方法流程图。


图1是短消息系统的统一数据库接口结构示意图,囿于篇幅,该图仅画出了对ORACLE的OCI和SYBASE的DB LIB两种数据库进行封装的结构作为示意,为了叙述方便,以下均以对此两种数据库的封装为例进行叙述,至于更多的其他类型数据库的应用,本领域的普通技术人员在理解本发明的基础上,同样可以实现本发明的目的和效果。
如图1所示,通常,应用程序应该主动发起向数据库服务器的连接,并维护该连接的有效性,直到应用程序结束、终止该数据库连接时为止。但由于某些数据库系统存在并发连接数限制,并且连接到数据库服务器的进程并非时时都需要操作数据库,以及存在数据库负荷的不均匀性,因此,本发明采用了连接池技术来提高应用系统的数据库利用效率。
所谓连接池,指应用程序在使用数据库之前,根据系统资源和业务需求,统一建立若干个目标数据库连接,并放入一个缓冲池中进行统一管理,如数据库调用的系统初始化、线程安全性控制、维护连接有效性、数据库连接的分配、回收及释放以及资源并发控制等等工作。考虑到共享数据库连接跨越进程边界的困难,关于连接池的讨论都局限于一个进程内部的若干子进程或子线程的实现范围。
统一数据库接口的连接池实际上为可在同一进程中不同线程之间使用的共享资源。由于该资源需要统一管理和分配,因此,必需有专门的线程来负责该连接池的建立,管理和撤消。同时,由于应用程序可能在使用连接池与否的问题上有选择性,因此,连接池提供的对外接口应与不使用连接池选项时保持一致。考虑上面两条,可以采用如下方式支持连接池功能为统一访问数据库接口,所述连接池提供一种初始化模式选项,当该选项在应用中被设置时,则在初始化数据库调用接口环境时创建连接池管理线程。当该线程创建后,初始化连接池缓冲区,等待有连接加入该池中,连接加入的个数可在连接选项中指定。当有连接加入后,根据连接选项决定该连接是否立即分配或保持。该连接的服务名,用户名和密码都将在连接池中被保持,当应用程序再次调用获取对应连接时,连接池中对应连接将被分配。
当连接池建立以后,管理线程将定时检查该连接的有效性,以及发现并清除连接的异常占用状态;进一步还可对数据库连接的使用进行统计。
当应用程序终止,通过消息或信号通知该连接池管理线程,由该管理线程完成所有数据库连接的释放。
在连接的分配和回收过程中,需要考虑的是如何在各个线程间实现连接安全使用。因为同一个连接在同时被多个线程访问的后果是无法预期的,必须保证同一时刻一个连接只能被一个线程或进程使用。为了达到该目的,首先,在连接池上设置临界区,任何对连接池中连接的申请必须进入临界区中才能从连接池中获取数据库连接资源;其次,任何一个连接必须遵循只有当连接被释放后才能且只能被分配一次的原则,对此设置连接的使用标志,当连接被分配时,该标志置位,释放时被复位。
为了防止该连接被超长时间占用,在各个连接上设置每次申请到释放的超时,如果设置该超时为0,表明线程需永久占用该连接。反之,当该超时到达时,连接管理进程将强行中断该线程,释放该连接。
结合图2,本发明所述的方法可以分为如下的步骤1.创建数据库连接池;2.对各数据库系统的底层调用接口按功能进行分类;3.根据分类,封装底层调用接口;4.将封装好的统一数据库接口做成动态库;5.通过动态库进行读或写访问。。
本发明所述的对各数据库系统的底层调用接口按功能进行分类,即对各种数据库系统的底层调用接口API按功能进行了分类,主要分为以下几类
1.创建并初始化调用层接口(CLI)环境;2.申请句柄和数据结构;3.创建数据库连接,建立会话;4.创建数据库错误处理例程;5.准备并执行SQL语句;6.对执行查询的SQL语句,处理检索到的结果集;7.断开会话和连接;8.释放句柄和数据结构,释放调用层接口(CLI)环境资源。
由于特定数据库系统支持的数据类型及各数据类型之间的转换存在较大差别,因此,本发明支持以下数据类型定长字符型,变长字符型,微整型,短整形,整型,浮点型,定长二进制型,变长二进制型,日期型等。
在本发明中分外部数据类型和内部数据类型两种。所谓外部数据类型指通过统一数据库接口可在程序中使用的数据类型。而内部数据类型指DBMS内部支持和实现的数据类型。在通过统一数据库接口操作数据库数据时必须要完成数据在内部数据类型和外部数据类型之间的转换。外部数据类型为统一数据库接口定义的数据类型,在属主机语言支持的基本数据类型定义,可在应用程序中直接使用。统一数据库接口定义了类型转换码的宏,表示读取的数据列转换到输出变量中的数据类型。保证输出变量缓冲区足够大以及数据类型转换的正确是应用程序的责任。
应用本发明上述介绍的方法,接下来就可以方便地针对各种不同数据库进行读写操作了。
下面说明本发明的统一数据库接口方法在SYBASE和ORACLE的具体实施例中的实现过程。
ORACLE OCI中,进行一次数据库操作需要以下信息OCI环境、服务器信息、错误处理、进行数据库操作的上下文环境,上述信息齐备后,用户必须开始一次数据库会话,在该会话中,用户可以有选择的开始一次事务,然后组织一次SQL语句,通过执行组织好的SQL语句,ORACLE服务器返回需要的数据,然后,对于SELECT类SQL语句,用户必须根据返回的数据列,可将其绑定到输出变量中,对于其他无数据返回的SQL语句,只需简单返回成功或出错结果。对于错误结果,通过错误处理函数交给用户处理;数据操作完毕,用户根据前面的操作,决定是否提交或回滚当前事务。当用户没有显式开始一个事务时,统一数据库接口隐式开始一个事务,并在每次数据库操作成功时提交。
具体地,图3是实现写数据库(INSERT/UPDATE/DELETE)的流程图,步骤如下1.初始化数据库调用接口环境;2.申请与目标数据库的连接;3.开始一个数据库事务;4.组织一条或一批SQL语句;5.执行组织好的SQL命令,并判断执行结果;6.执行如不成功,则回滚当前事务,跳至8;7,如果执行成功,提交当前数据库事务,如需要,返回到3;8.断开数据库连接;9.释放数据库调用环境后,结束。
对于上述的步骤7,执行成功时,如需要,可返回到步骤3,重新开始一个数据库事务。
同样地,由于采用了本发明所述的方法,可以方便地进行数据库的读操作了。图4给出了实现读(查询)数据库(SELECT)的流程图,具体步骤如下1.初始化数据库调用接口环境;2.申请与目标数据库的连接;3.开始一个数据库事务;4.组织一条或一批SQL语句;5.执行组织好的SQL命令,并判断执行结果;6.执行如不成功,则跳到步骤9;7.执行如成功,根据SELECT语句将查询数据列绑定到输出变量,应用程序需指明输出变量的地址,长度及绑定后的查询列数据类型,应用程序应对输入参数的合法性负责;8.检索查询到的数据记录,直至所有记录行读取完毕或清除未读数据行为止;9.断开数据库连接;10.释放数据库调用环境。
本发明为了扩充统一数据库接口的功能,以满足应用的需求,在数据库连接中设置了一定大小的用户数据区,该用户数据区与前处理函数和后处理函数一起,可为数据库操作管理提供方便。比如,对数据库操作的次数,时间开销,分类等进行分析。统一数据库接口只提供了这样一种机制,应用层应对具体的数据操纵的合法性和数据解释负责。
另外,由于ORACLE OCI的线程安全性只能提供基于应用环境的线程级互斥机制,且在此基础上提供基于数据库连接的最大并发性,否则将由应用提供互斥机制;例如,如果考虑短消息系统对并发性要求比较高,为了保证多线程环境下数据库并发操作能正常高效进行,同时简化开发难度,本发明对每一个数据库连接都提供一套全部环境信息。所有的数据均包括在一个结构体中,该结构不对外开放,用户数据的获取,设置以及各种处理函数的设置必须通过专门函数进行。
SYBASE的DBLIB接口内部结构封装相对严密,因此编程接口也相对简单。所有的数据库连接及数据操作信息都保存在一个类型为DBPROCESS的指针指向内存块中。DBLIB中提供出错函数处理,显示事务申明,并在数据库连接DBPROCESS级别上提供线程安全性保证,因此,对DB LIB的封装很大程度上可直接利用其本身的功能便利,同时,DB LIB提供的连接选项和操作选项也相对ORACLE OCI要丰富,可酌情提供给统一数据库接口中调用。同时,本发明还将同封装ORACLE OCI一样提供统一的错误处理函数以及执行前处理和执行后处理函数。
综上所述,采用本发明,可以克服数据库规格不一致时,访问数据库效率低下甚至无法访问的缺点,保证了各种数据库系统的互连互通,特别是对于短消息系统来说不需修改任何程序,可以直接访问相应的数据库系统。因此,本发明更适合应用到其他对数据库访问实时性要求较高的系统中。
权利要求
1.一种统一访问数据库系统的方法,其特征在于(1)创建数据库连接池;(2)对各数据库系统的底层调用接口按功能进行分类;(3)根据分类,封装底层调用接口;(4)将封装好的统一数据库接口做成动态库;(5)通过动态库进行读或写访问。
2.如权利要求1所述的统一访问数据库系统的方法,其特征在于所述对各数据库系统的底层调用接口按功能进行分类,包括创建并初始化调用层接口(CLI)环境;申请句柄和数据结构;创建数据库连接,建立会话;创建数据库错误处理例程;准备并执行(中文)SQL语句;对执行查询的SQL语句,处理检索到的结果集;断开会话和连接;释放句柄和数据结构,释放调用层接口(CLI)环境资源。
3.如权利要求1所述的统一访问数据库系统的方法,其特征在于所述通过动态库进行写访问的步骤包括(1)初始化数据库调用接口环境;(2)申请与目标数据库的连接;(3)开始一个数据库事务;(4)组织一条或一批(中文?)SQL语句;(5)执行组织好的SQL命令,并判断执行结果;(6)执行如不成功,则回滚当前事务,跳至步骤(8);(7)如果执行成功,提交当前数据库事务,如需要,返回到步骤(3);(8)断开数据库连接;(9)释放数据库调用环境后,结束。
4.如权利要求3所述的统一访问数据库系统的方法,其特征在于所述步骤(7)执行成功时,如需要,可返回到步骤(3),重新开始一个数据库事务。
5.如权利要求1所述的统一访问数据库系统的方法,其特征在于所述通过动态库进行读访问的步骤包括(1)初始化数据库调用接口环境;(2)申请与目标数据库的连接;(3)开始一个数据库事务;(4)组织一条或一批SQL语句;(5)执行组织好的SQL命令,并判断执行结果;(6)执行如不成功,则跳到步骤(9);(7)执行如成功,根据SELECT语句将查询数据列绑定到输出变量,应用程序需指明输出变量的地址,长度及绑定后的查询列数据类型,应用程序应对输入参数的合法性负责;(8)检索查询到的数据记录,直至所有记录行读取完毕或清除未读数据行为止;(9)断开数据库连接;(10)释放数据库调用环境。
6.如权利要求1所述的统一访问数据库系统的方法,其特征在于所述连接池提供一种初始化模式选项,当该选项在应用中被设置时,则在初始化数据库调用接口环境时创建连接池管理线程;当该线程创建后,初始化连接池缓冲区,等待有连接加入该池中,连接加入的个数可在连接选项中指定;当有连接加入后,根据连接选项决定该连接是否立即分配或保持;该连接的服务名,用户名和密码都将在连接池中被保持,当应用程序再次调用获取对应连接时,连接池中对应连接将被分配。
7.如权利要求6所述的统一访问数据库系统的方法,其特征在于当连接池建立以后,管理线程将定时检查该连接的有效性,发现并清除连接的异常占用状态;进一步对数据库连接的使用进行统计。
8.如权利要求6或7所述的统一访问数据库系统的方法,其特征在于当应用程序终止,通过消息或信号通知该连接池管理线程,由该管理线程完成所有数据库连接的释放。
全文摘要
本发明提供一种高效的统一访问数据库系统的方法,其步骤是创建数据库连接池;对各数据库系统的底层调用接口按功能进行分类;根据分类,封装底层调用接口;将封装好的统一数据库接口做成动态库;通过数据库进行读或写访问;本发明所述方法由于所封装的接口均为各数据库系统的最高效的底层调用接口,实测表明,效率比采用ODBC技术高出20%~30%,提高了数据库的访问速度,进而极大地提高了系统的处理能力;由于封装了多种数据库系统的底层接口,因此,只需做简单的配置,而不需要修改源代码,也不需重新编译,可直接应用在不同的商用数据库系统中,提高了系统的互连互通性能,大大降低了开发和维护的成本,也极大提高了系统的稳定性。
文档编号G06F17/30GK1448867SQ02111249
公开日2003年10月15日 申请日期2002年3月30日 优先权日2002年3月30日
发明者于秀昌, 胡静波, 梁平 申请人:深圳市中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1