一种基于oci9的数据库访问中间件的制作方法

文档序号:6583381阅读:277来源:国知局

专利名称::一种基于oci9的数据库访问中间件的制作方法
技术领域
:本发明属计算机应用领域,尤其涉及分布式系统、可以用于分布式系统中访问数据库实现的一种基于OCI9的数据库访问中间件。
背景技术
:在大型分布式系统中,通常配有数据库服务器,服务器之外的主机在安装了Oracle客户端以后就可以访问数据库,以主机为UNIX系统为例,通常使用的是Oracle提供的OCI(OracleCal1Interface)作为访问的编程接口,目前OCI的最新版本是以OCI9为基础延续发展而来的,OCI接口函数有两种工作方式bloCking(阻塞)和non_blocking(非阻塞),在非阻塞方式下,通过循环调用同一个接口函数直至得到最后的运行结果,这样的函数如OCIStmtFetch,如果一个函数运行一次就可以获得结果,如OCIServerDetach函数,那么这个函数在OCI函数工作于阻塞和非阻塞方式下运行都一样,我们把这种函数称为非阻塞函数。如果使用OCI访问数据库的进程并不和Oracle数据库服务器位于同一台主机上,当服务器突然宕机或网线故障时,OCI的非阻塞函数就会发生长达十多分钟的阻塞,可见,OCI接口这种应用软件接口级的非阻塞和网络编程中的某些Socket函数那样操作系统级的非阻塞是无法比拟的,一个函数长时间的阻塞对要求长期连续运行的系统通常是不允许的,而且如果后续代码对这种阻塞结束后的处理的难度估计不足,那么即便是故障得以解除,也会使重新连接数据库失败,从而出现灾难性的后果。目前一些嵌入式系统如VxWorks中Oracle不提供OCI的实现,如果要访问Oracle数据库只有通过其他方法。本方法通过开发一个基于OCI技术,结合网络技术和多线程技术的运行于数据库服务器上的中间件,可以使系统中除服务器外的主机访问数据库不基于OCI接口,这样在上述情况出现时不再出现无法控制的超长时间阻塞,同时为不能运行OCI的平台提供了访问数据库的可能性。
发明内容本发明的目的是提供一种基于OCI9的数据库访问中间件,以期克服访问ORACLE数据库时发生异常,客户端长时间阻塞以及数据丢失或解决无OCI实现的操作系统平台访问数据库的问题。实现本发明目的的技术解决方案是这样的一种基于OCI9的数据库访问中间件,运行于空管系统(ATC)的UNIX系统中,包括中间件运行端(MDB)、客户端(DBC)和一个使用客户端的剩余记录收集端(DUMP)构成。运行端(MDB)部署于数据库服务器上,客户端(DBC)以动态库或静态库的形式提供给需要访问数据库的进程使用,剩余记录收集端(DUMP)以进程的形式运行于每个需要访问数据库的主机中。其特征在于(1)所述中间件运行端(MDB)运行于数据库服务器上,使用OCI9访问数据库,其运行时的侦听端口作为命令行参数传入,随侦听端口不同可以运行为几个不同的实例。运行端(MDB)设计为每一个客户端(DBC)的连接创建一个线程,该线程在接受一个客户端连接时产生一个新的文件描述符时被创建,每个创建的线程里完成使用这个文件描述符对SQL请求进行远端请求的接收和结果回发;具体步骤如下线程开始,进入Select函数,某客户端连接的FD请求是否到达?如果No,回到Select函数阶段,如果Yes,调用OCI接口执行请求,使用该FD将结果回发,结束或者获取下一个读集触发的FD,重新回到客户端连接的FD请求是否到达阶段。(2)所述的客户端(DBC)使用TCP协议与运行端(MDB)通信,作为TCP的客户端,客户端(DBC)使用了支持并发读写的嵌入式数据库SQLite;客户端(DBC),由系统中除数据库以外的主机的进程使用,每个客户端(DBC)连接处于不同的侦听端口的运行端(MDB),客户端(DBC)提供接口进行SQL语句执行,对于查询语句提供查询信息的返回和再一次提取,直到查询完毕接口返回错误码;当一个新的查询开始时,前一个查询自动被终止。具体步骤如下函数开始,语句分析,数据库是否正常?如果是Yes,开始执行,执行成功,返回结果;如果回答No则进入Select语句(即查询语句)判定,如果Yes,执行失败;如果No,写入本地SQLite,执行失败未来执行,则返回结果。(3)所述的剩余记录收集端(DUMP)是一个使用客户端(DBC)的进程,其内部使用SQLite数据库,DUMP间隔较长时间(可配置)定时检查SQLite数据库中是否有需要写入数据库的数据,同时检查与运行端(MDB)的通信是否正常;当两个条件都满足时,收集端将(DUMP)SQLite中的记录取出,送入运行端(MDB)执行。所述的基于OCI9的数据库访问中间件,其特征在于当与运行端(MDB)不能正常通信时,(网线忽然被拔掉、运行端主机突然宕机),客户端返回错误,查询失败;对于非查询语句,如插入、更新的语句,接口提供两种运行方式的选择1.与运行端通信正常时写入,不正常时返回错误;2.与运行端通信不正常时,写入本地数据库,待通信恢复正常时由收集端读出写入数据库。客户端中使用了1支持并发读写的嵌入式数据库SQLite,当运行方式为后一种方式时,非查询语句写入SQLite的本地文件中。根据权利上述的基于OCI9的数据库访问中间件,其特征在于所述的客户端(DBC)使用TCP协议与运行端(MDB)通信,即使用非阻塞TCP通信,其步骤如下在非阻塞连接执行后,停顿数秒钟(通过配置文件可配置),然后使用对客户端fd(文件描述符)送入select函数,该函数执行时使用一个很小的超时值,然后检查该fd对读写集是否置位,只要有一个置位,对这个fd调用getsockopt函数使用参数S0_ERR0R,如果检查无错误发生,则认为连接成功。4、根据权利要求1所述的基于OCI9的数据库访问中间件,其特征在于所述的客户端(DBC)接口执行SQL语句时,客户端(DBC)在执行SQL语句或继续查询语句时,都需要发送报文至运行端,发送使用非阻塞send函数,当报文在指定时间不能发出时或返回错误值E_PIPE,认为运行端与客户端主机通信故障;运行端在探测到本地ORACLE数据库异常时,会设置一个进程中全局的加锁变量db_status,将该变量置为0,表示数据库异常,反之置为1;运行端中与各个客户端关联的线程中定时器驱动的回调函数检查到该变量发生变化时,向相应客户端发出报文通告数据库状态。客户端收到报文时,同步修改内部的数据库状态,当下一个指令执行时可以直接执行相应操作如在数据库故障时,查询语句返回错误,非查询语句写入本地数据库中。与现有技术相比本发明有着显著的有益效果1、实现了没有安装Oracle客户端的主机访问ORACLE数据库的功能,同时接口提供在操作数据库时对本地与数据库服务通信的即时检查;2、实现了在客户端无操作时提供本机与服务端通信的检查并使用异步方式在通信故障、恢复状态转换时通知客户端使用者的有益功能;3、实施本发明后客户端不会像传统OCI接口一样在网线突然拔掉或服务器突然宕机时处于长时间的阻塞等待,最坏在2-3秒内即可以检查出客户端与服务器间的通信故障;4、可以在客户机与服务器间通信故障期间对非查询SQL语句进行本地保存,在通讯恢复时送入运行端执行。5、本发明在空管系统(ATC)中的试验运行获得了显著的效果。图1是本发明所述的数据库访问中间件的基本结构示意图。图2是本发明所述的运行端为每位客户端连接创建的线程类框图示意图。图3是本发明所述的运行端运行流程框图示意图。图4是本发明所述的客户端运行流程框图示意图。图5是本发明所述的客户端实施例工作流程示意图。图6是本发明所述的运行端实施例工作流程示意图。图7是所述的数据库访问中间件工作部署示意图。图8是所述的数据库访问中间件实施例工作流程示意图。具体实施例方式通过图1可知,所述的中间件,运行于空管系统(ATC)的UNIX系统中,由中间件运行端(MDB)、客户端(DBC)和一个使用客户端的剩余记录收集端(DUMP)组成。运行端(MDB)部署于数据库服务器上,客户端(DBC)以动态库或静态库的形式提供给需要访问数据库的进程使用,剩余记录收集端(DUMP)以进程的形式运行于每个需要访问数据库的主机中。中间件运行端(MDB)运行于数据库服务器上,使用OCI9访问数据库,其运行时的侦听端口作为命令行参数传入,随侦听端口不同可以运行为几个不同的实例。从2、图3可知,运行端设计为每一个客户端的连接创建一个线程,该线程在接受一个客户端连接时产生一个新的文件描述符时被创建,每个创建的线程里完成使用这个文件描述符对SQL请求进行远端请求的接收和结果回发。线程具体步骤如下线程开始,进入Select函数,某客户端连接的FD请求是否到达?如果No,回到Select函数阶段,如果Yes,调用OCI接口执行请求,使用该FD结果回发,结束或者获取下一个读集触发的FD,重新回到客户端连接的FD请求是否到达阶段。这些线程彼此之间联系较少,并不需要一个可管理的线程池机制;这些线程工作机制和完成的任务都一样,通过编写一个线程类即可满足要求,该线程类内部使用Select多路复用机制,提供文件描述符的处理回调和定义时间间隔的定时器回调函数,数据的收发和命令执行均在回调中完成。运行端(MDB)选用0CI9作为Oracle数据库的接口,运行端(MDB)在主线程中注册一个在公用端口实施侦听的ListenSocket等待客户端(DBC)接入,每当有客户端(DBC)connect请求,accept产生一个新的acc印tFd以后,立即使用图2中的线程类创建一个新的线程,该线程先与本地数据库建立连接,再注册acc印tFd的回调函数,在这个函数里接收来自客户端的(DBC)数据,对收到的数据解析出SQL请求,然后调用OCI接口立即执行;如果是非查询SQL语句,立即执行并实施提交;如果是查询SQL语句,则提取一定数量不超过网络报文最大容量的多个记录组成报文发送给客户端(DBC),报文里同时包含记录的起始数和记录数,在客户端(DBC)同时提供继续查询的接口供后续查询Z用ο在运行端(MDB)主线程注册了一个用”select1fromdual”语句检查数据库是否运行正常的定时器回调函数,当发现数据库异常时立即修改一个配有读写锁的数据库状态值。每个与客户端(DBC)对应的线程注册了一个定时器读取该状态,一旦检查到该状态变化,立即发送给客户端(DBC),保证只有在数据库运行正常时才能将SQL请求送出。运行端(MDB)是一个有多个线程同时运行的进程,为保证每个线程能够及时运行,需要在线程调度上设置为SCHED_RR方式。所述客户端(DBC)使用TCP协议与运行端(MDB)通信,作为TCP的客户端。客户端(DBC)使用了支持并发读写的嵌入式数据库SQLite,客户端(DBC)由系统中除数据库以外的主机的进程使用,每个客户端(DBC)连接处于不同的侦听端口的运行端(MDB);客户端(DBC)提供接口进行SQL语句执行,对于查询语句提供查询信息的返回和再一次提取,直到查询完毕接口返回错误码;当一个新的查询开始时,前一个查询自动被终止。图4所示具体步骤如下函数开始,语句分析,数据库是否正常?如果是Yes,开始执行,执行成功,返回结果;如果回答No则进入Slecte语句判定,如果Yes,执行失败;如果No,写入本地SQLite,执行失败未来执行,则返回结果。所述的剩余记录收集端(DUMP)是一个使用客户端(DBC)的进程,其内部使用SQLite数据库,DUMP间隔较长时间(可配置)定时检查SQLite数据库中是否有需要写入数据库的数据,同时检查与运行端(MDB)的通信是否正常;当两个条件都满足时,收集端将(DUMP)SQLite中的记录取出,送入运行端(MDB)执行。剩余记录收集端(DUMP)是一个独立进程,使用客户端(DBC)同时使用SQLite嵌入式数据库的API,DUMP进程每隔一分钟检查sql.table表中有无记录,如果有读出一条SQL语句的记录送往运行端执行,执行成功后删除本地该记录;如果执行不成功,则不进行删除操作。选用TCP作为运行端(MDB)和客户端(DBC)之间通信的网络协议,显然运行端(MDB)是TCP的服务端,而使用客户端(DBC)的远端进程作为客户端;当与运行端(MDB)不能正常通信时,如网线忽然被拔掉、运行端(MDB)主机突然宕机时,客户端(DBC)返回错误,查询失败;对于非查询语句,如插入、更新的语句,接口提供两种运行方式的选择1.与运行端(MDB)通信正常时写入,不正常时返回错误;2.与运行端(MDB)通信不正常时,写入本地数据库,待通信恢复正常时由收集端(DUMP)读出写入数据库。由于客户端(DBC)中使用了支持并发读写的嵌入式数据库SQLite,当运行方式为后一种方式时,非查询语句写入SQLite的本地文件中。所述的客户端(DBC)使用TCP协议与运行端(MDB)通信,即使用非阻塞TCP通信,其步骤如下在非阻塞连接执行后,停顿数秒钟(通过配置文件可配置),然后使用对客户端fd(文件描述符)送入select函数,该函数执行时使用一个很小的超时值,然后检查该fd对读写集是否置位,只要有一个置位,对这个fd调用getsockopt函数使用参数S0_ERROR,如果检查无错误发生,则认为连接成功。在使用Socket缺省的阻塞工作方式时,如果出现上述宕机和网线故障,同样会出现长时间的阻塞,因此只有使用非阻塞TCP通信才能完全避免这个问题。所述的客户端(DBC)接口执行SQL语句时,客户端(DBC)在执行SQL语句或继续查询语句时,都需要发送报文至运行端,发送使用非阻塞send函数,当报文在指定时间不能发出时或返回错误值E_PIPE,认为运行端与客户端主机通信故障;运行端在探测到本地ORACLE数据库异常时,会设置一个进程中全局的加锁变量db_StatuS,将该变量置为0,表示数据库异常,反之置为1;运行端中与各个客户端关联的线程中定时器驱动的回调函数检查到该变量发生变化时,向相应客户端发出报文通告数据库状态。客户端收到报文时,同步修改内部的数据库状态,当下一个指令执行时可以直接执行相应操作如在数据库故障时,查询语句返回错误,非查询语句写入本地数据库中。当客户端不能正常执行SQL语句时,客户端将非查询语句存入SQLite产生的本地数据库文件,同时DUMP进程在适合的时间读取这些内容并执行相应的删除。整个中间件对SQLite的操作如下①首先,打开SQLite数据库文件,如果不存在则创建;②其次,测试要创建的表是否存在,如果不存在则创建表,中间件使用的表名为sql_table;③插入非查询sql语句;④需要操作时取出记录;解释sql语句按行返回结果取出每行的每列,执行想要的操作;⑤删除对应记录;⑥关闭数据库。图7是所述的数据库访问中间件工作部署示意图,图8是所述的数据库访问中间件实施例工作流程示意图,具体操作如下本发明所描述的中间件已在多个实际ATC项目中得以实施,在实施过程中随系统主机规模、进程规模大小不同,运行端可能运行为端口不同的多个实例,这些实例通过在命令行参数指定读取的配置文件不同而运行为不同的实例,配置文件的区别在于侦听端口的不同;各主机中使用客户端的不同进程需要配置连接数据库服务器中运行的运行端的不同实例,也需要在各自的客户端配置文件中指定不同的连接端口。图5,6说明了配置客户端运行段的工作流程,图7说明了数据库中间件运行端为两个实例,其他主机节点分别按这两组访问数据的示意图。权利要求一种基于OCI9的数据库访问中间件,运行于空管系统(ATC)的UNIX系统中,包括中间件运行端(MDB)、客户端(DBC)和一个使用客户端的剩余记录收集端(DUMP)构成,运行端(MDB)部署于数据库服务器上,客户端(DBC)以动态库或静态库的形式提供给需要访问数据库的进程使用,剩余记录收集端(DUMP)以进程的形式运行于每个需要访问数据库的主机中,其特征在于(1)所述中间件运行端(MDB)运行于数据库服务器上,使用OCI9访问数据库,其运行时的侦听端口作为命令行参数传入,随侦听端口不同可以运行为几个不同的实例,运行端(MDB)设计为每一个客户端(DBC)的连接创建一个线程,该线程在接受一个客户端连接时产生一个新的文件描述符时被创建,每个创建的线程里完成使用这个文件描述符对SQL请求进行远端请求的接收和结果回发;具体步骤如下线程开始,进入Select函数,某客户端连接的FD请求是否到达?如果No,回到Select函数阶段,如果Yes,调用OCI接口执行请求,使用该FD将结果回发,结束或者获取下一个读集触发的FD,重新回到客户端连接的FD请求是否到达阶段;(2)所述的客户端(DBC)使用TCP协议与运行端(MDB)通信,作为TCP的客户端,客户端(DBC)使用了支持并发读写的嵌入式数据库SQLite;客户端(DBC),由系统中除数据库以外的主机的进程使用,每个客户端(DBC)连接处于不同的侦听端口的运行端(MDB),客户端(DBC)提供接口进行SQL语句执行,对于查询语句提供查询信息的返回和再一次提取,直到查询完毕接口返回错误码;当一个新的查询开始时,前一个查询自动被终止;具体步骤如下函数开始,语句分析,数据库是否正常?如果是Yes,开始执行,执行成功,返回结果;如果回答No则进入Select语句(即查询语句)判定,如果Yes,执行失败;如果No,写入本地SQLite,执行失败未来执行,则返回结果;(3)所述的剩余记录收集端(DUMP)是一个使用客户端(DBC)的进程,其内部使用SQLite数据库,DUMP间隔较长时间(可配置)定时检查SQLite数据库中是否有需要写入数据库的数据,同时检查与运行端(MDB)的通信是否正常;当两个条件都满足时,收集端将(DUMP)SQLite中的记录取出,送入运行端(MDB)执行。2.根据权利要求1所述的基于OCI9的数据库访问中间件,其特征在于当与运行端(MDB)不能正常通信时,(网线忽然被拔掉、运行端主机突然宕机),客户端返回错误,查询失败;对于非查询语句,如插入、更新的语句,接口提供两种运行方式的选择1.与运行端通信正常时写入,不正常时返回错误;2.与运行端通信不正常时,写入本地数据库,待通信恢复正常时由收集端读出写入数据库;客户端中使用了支持并发读写的嵌入式数据库SQLite,当运行方式为后一种方式时,非查询语句写入SQLite的本地文件中。3.根据权利要求2所述的基于OCI9的数据库访问中间件,其特征在于所述的客户端(DBC)使用TCP协议与运行端(MDB)通信,即使用非阻塞TCP通信,其步骤如下在非阻塞连接执行后,停顿数秒钟(通过配置文件可配置),然后使用对客户端fd(文件描述符)送入select函数,该函数执行时使用一个很小的超时值,然后检查该fd对读写集是否置位,只要有一个置位,对这个fd调用getsockopt函数使用参数S0_ERR0R,如果检查无错误发生,则认为连接成功。4.根据权利要求2所述的基于OCI9的数据库访问中间件,其特征在于所述的客户端(DBC)接口执行SQL语句时,客户端(DBC)在执行SQL语句或继续查询语句时,都需要发送报文至运行端,发送使用非阻塞send函数,当报文在指定时间不能发出时或返回错误值E_PIPE,认为运行端与客户端主机通信故障;运行端在探测到本地ORACLE数据库异常时,会设置一个进程中全局的加锁变量db_status,将该变量置为0,表示数据库异常,反之置为1;运行端中与各个客户端关联的线程中定时器驱动的回调函数检查到该变量发生变化时,向相应客户端发出报文通告数据库状态;客户端收到报文时,同步修改内部的数据库状态,当下一个指令执行时可以直接执行相应操作如在数据库故障时,查询语句返回错误,非查询语句写入本地数据库中。全文摘要本发明公开了一种基于OCI9的数据库访问中间件,涉及计算机应用领域尤其可应用于分布式系统中访问数据库的实现。通过开发一个基于OCI技术,结合网络技术和多线程技术的运行于数据库服务器上的中间件,包括中间件运行端、客户端和一个使用客户端的剩余记录收集端构成;运行端部署于数据库服务器上,客户端以动态库或静态库的形式提供给需要访问数据库的进程使用,剩余记录收集端以进程的形式运行于每个需要访问数据库的主机中。可以使系统中除服务器外的主机访问数据库不基于OCI接口,不会出现无法控制的超长时间阻塞;克服了访问ORACLE数据库时发生异常,客户端长时间阻塞以及数据丢失或解决无OCI实现的操作系统平台访问数据库的问题。文档编号G06F17/30GK101814077SQ20091021654公开日2010年8月25日申请日期2009年12月4日优先权日2009年12月4日发明者刘建波,刘舒,吴志红,季玉龙,胡术申请人:四川川大智胜软件股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1