一种基于DSS框架的数据库子系统设计方法与流程

文档序号:12465068阅读:249来源:国知局
一种基于DSS框架的数据库子系统设计方法与流程

本发明涉及一种基于DSS框架的数据库子系统设计方法。



背景技术:

Darwin Streaming Server简称DSS。DSS是Apple公司提供的开源实时流媒体播放服务器程序,整个程序使用纯粹C++编写,在设计上遵循高性能、简单、模块化等程序设计原则,务求做到程序高效,可扩充性好,因此DSS服务器系统在跨平台的支持上是相当理想的,它可以运行在Windows NT、Windows 2000及以上的windows内核版本,同时也能良好的运行在*NIX的各种版本上,包括Mac OS X,Linux,FreeBSD,Solaris,同时DSS基于标准的流媒体协议RTSP,RTP/RTCP进行开发,因此在运用上具有极强的广泛性和通用性。

在此基础上,DSS框架设计成一个较为复杂的,层次结构较为清晰的流媒体服务器系统,主要由基础功能组件(网络,字符串处理,内存开辟释放,模块工具,内部错误消息定义,全局数据字典等等),各种子系统(RTSP,RTP,RTCP等等),各种功能插件(身份验证,身份授权,数据流预处理,数据流处理,HTTP隧道处理,服务器消息回复等等)组合而成,很多开发人员主要会进行各种功能插件的开发,在服务器启动的时候进行动态加载,当主流程状态机处理到相应状态的时候将调用对应的插件,此时服务器将控制权交给插件进行相应功能运作。因此,在这个基础上从使用结构的角度上,服务器被分成两个大块,服务器内部以及服务器外部,服务器内部由各种基础功能组件和子系统所组成,服务器外部由功能插件组成,这两个部分之间通过函数指针设计成的API接口进行数据的交互以及基础功能的实现。

然而开发人员在进行开发的过程中往往不止需要设计插件,同时也需要对服务器内部进行必要的功能增加或者修改,现有DSS框架对于音视频数据流之外的数据来源均从配置文件中进行加载,包括服务器启动的大量配置参数,子系统运行过程中需要的数据,模块插件所需要的数据,例如对于身份验证,对于接入IP段的限制等等,这在很大程度上对项目的实际使用造成极大的不方便,因此在DSS框架中加入数据库的功能是实际项目运用中非常必要的,而现有的DSS框架中的数据库功能设计较为简单,并没有根据DSS框架的分时特点,以及数据库操作数据的及时性特点也就是在DSS分时框架中的需要另数据库任务产生抢占功能,并且在保护好原来任务各种状态的前提下中断原来任务,在成功从数据库中获取数据之后再恢复原来任务,导致在使用上会出现各种意料之外的严重问题。为了避免这些问题,本发明综合上述提到的服务器特点以及ODBC(Open Database connect 开放数据互连)方式的数据库运用,详细设计了基于DSS分时框架ODBC子系统功能。



技术实现要素:

本发明的一个目的在于提供一种基于DSS框架的数据库子系统设计方法,解决了现有DSS框架下数据库子系统任务抢占、功能简单及其衍生的各类问题。

为了实现上述目的,本发明的技术方案如下:

一种基于DSS框架的数据库子系统设计方法,包括以下步骤:

步骤1、在DSS组件结构中设计数据库任务线程类继承自DSS系统线程类、设计数据库任务类继承自DSS任务类;该数据库任务线程类作为数据库线程组件用于以一条独立且唯一的线程负责推送数据库任务,且该条线程负责维护一个任务堆,这个任务堆将最近时间片任务弹出送往实际工作线程;该数据库任务类用于在DSS服务器启动的时候调用静态初始化函数启动数据库任务线程类中的线程,还用于调用数据库任务类线程接口执行数据库任务的插入数据库任务线程类中优先队列的操作以及用于维护任务的各种属性和操作函数,所述数据库任务线程类和数据库任务类互为友元类;

步骤2、在DSS子系统结构中设计数据库子系统类以及子系统执行接口类;该数据库子系统类子系统类首先是作为一个容器继承自数据库接口类,负责各种数据库任务相关检查以及最重要的运行函数,该运行函数用于执行实际的数据库操作并且将执行结果存放在DSS数据系统中的数据库子系统数据字典中,为真正的重要执行函数;该数据库接口负责执行数据库初始化工作以及全局数据字典的初始化;

步骤3、在DSS框架的Private.h文件中的回调函数结构中增加数据库操作的回调函数定义;

在Callbacks.h文件中增加数据库操作函数声明,同时在Callbacks.cpp文件中增加声明函数;

在QTSS.h中引用数据库操作函数的声明;

在qtsserver.cpp中的初始化回调函数中完成对数据库操作函数的函数指针赋值;完成由DSS框架内部到DSS框架外部插件的API接口设计。

优选的,所述步骤1中,在DSS组件结构中的通用工具类库中设计数据库任务线程类继承自DSS系统线程类、设计数据库任务类继承自DSS框架的任务类,数据库任务线程类作为数据库线程组件,是DSS框架中唯一运行的数据库任务推动线程,也是构成数据库子系统的基础组件。

优选的,所述数据库任务线程类包括一个堆数据结构的成员变量,即优先队列,这个优先队列是由一完全二叉树构造而成,该完全二叉树的父节点始终大于或者小于左右子节点,这个优先队列用于将时间片最近的数据库任务推往树根节点,同时也包括对于堆变量进行抢占保护的堆互斥量以及驱动堆变量工作的堆信号量。

优选的,所述数据库任务线程类包括一个入口函数,该函数用于判断是否存在任务元素,当任务堆长度是否大于0时存在任务元素,如果已经存在任务元素,则入口函数再判断当前任务元素中的时间片是否已经到达超时,如果当前任务的时间片已经超时则将当前任务发送到DSS框架中的任务线程中进行实际运行数据库任务;

所述数据库任务线程类还包括一个执行数据库语句函数,该执行数据库语句函数用于将数据库任务指针推进堆变量,同时增加长度,驱动任务线程类的入口函数进行工作。

优选的,所述数据库任务类包括一个静态初始化函数和封装了数据库任务线程类中真正执行函数的执行数据库语句函数,该静态初始化函数在系统启动过程中系统初始化函数时被调用,调用该静态初始化函数时数据库任务推送线程开始运行;

该执行数据库语句函数作为数据库的API接口基础,在API将提供给DSS框架的外部插件使用时调用。

优选的,所述数据库任务类包括堆成员类,堆成员类作为数据库任务类的成员变量,也作为数据库任务线程类这个友元类的成员变量,堆成员变量具有保存任务指针的变量以及当前任务时间片的超时时间;

所述数据库任务类还包括数据库任务事件枚举结构,在任务事件枚举结构中定义当数据库任务实际被送入DSS工作线程运行时需要执行的事件定义。

优选的,数据库接口包括一个静态初始化函数,该静态初始化函数在数据库子系统正式启动之前预先调用,负责对数据库子系统的相关数据进行全局数据字典的开辟,这些数据字典将在DSS框架内部和外部插件进行交互使用。

优选的,所述步骤2中,在DSS子系统结构的Server.tproj结构中设计数据库子系统类,这个类继承自数据库接口以及DSS框架中的变长字符串格式化类。数据库类将作为真正的任务载体送入DSS框架的工作线程中运行;

所述步骤3之后还包括步骤4:在DSS子系统结构的Server.tproj结构中设计数据库子系统的接口类,该接口类继承自字典类以及数据库任务类,其中字典类为DSS框架中的数据字典类,这该接口类用于提供执行数据库方式的数据库操作中的各种操作接口,还用于保存数据库中各个属性参数的值,以及用于保存着数据库任务执行之后的返回结果集。

优选的,数据库包括一个静态初始化函数、一个真正任务执行函数以及运行函数,该静态初始化函数进行任务的辅助信息初始化;该真正任务执行函数在DSS框架工作线程中将被提取出来执行;该运行函数执行数据库方式下的数据库操作,数据库操作为:首先获取SQL语句,然后送入数据库语句执行函数中,接着获取执行结果集计数以及最后结果存放进数据库接口中的数据字典变量;

对于数据库运行函数的结果集使用DSS框架中可变长度的字符串格式化类,这个类在构造函数的时候将会开辟预定于大小的空间用于存放结果集,如果结果集大于预定于大小的空间会自动开辟2倍原大小的空间。

优选的,对于数据库操作函数:执行数据库语句内部实现中使用数据库对象指向实际执行数据库语句的参数默认为0,也即另数据库任务需要从堆中立即被推进实际工作线程,同时回到调用模块中,数据库的API一旦调用就要使用返回一个以毫秒为单位的数值进行中断当前任务模块。

采用上述方案后,本发明的有益效果是:本发明根据DSS框架的分时特点,以及数据库操作数据的及时性特点,设计的数据库子系统设计方法,解决了现有DSS框架下数据库子系统任务抢占、功能简单及其衍生的各类问题,设计的数据库子系统可在DSS框架内部方便的使用数据库操作,并且开放出完善的数据库API操作接口提供给DSS框架外部插件,使得基于DSS框架的开发更加便捷,更符合实际项目的运用。

以下结合附图和具体实施方式对本发明做进一步说明。

附图说明

图1:本发明数据库在DSS框架中的组件结构示意图;

图2;本发明数据库子系统在DSS框架中的结构示意图;

图3-1;本发明数据库子系统在DSS框架中驱动状态示意图;

图3-2为将时间片超时的任务推送进任务类任务线程状态示意图(等待13毫秒时间值任务已经到达,推送出去执行);

图3-3为将根据优先队列方式的等待14毫秒时间值任务推到树根状态示意图;

图3-4:对空节点进行补充示意图;

图3-5:再次形成一完整队列状态示意图;

图4:本发明数据子系统在DSS外部插件中运行示意图。

具体实施方式

如图1所示,本发明揭示的一种基于DSS框架的数据库子系统设计方法,包括以下步骤:

第一步:在DSS组件结构(通用工具类库CommonUtlitiesLib )中设计数据库任务线程类(ODBCTaskThread)继承自DSS系统线程类(OSThread),设计数据库任务类(ODBCTask)继承自DSS任务类(Task),数据库任务线程以一条独立的唯一的线程负责推送数据库任务,这条线程主要维护一个任务堆(优先队列),这条线程将堆中最近时间片任务弹出送往实际工作线程:

上述数据库任务线程类和数据库任务类互为友元类,数据库任务线程类作为数据库线程组件,是DSS框架中唯一运行的数据库任务推动线程,也是构成数据库子系统的基础组件;

第二步:在DSS子系统结构(Server.tproj)中设计数据库子系统类(QTSSODBC)以及子系统执行接口类(QTSSODBCInterface);数据库子系统类首先是作为一个容器继承自数据库接口类,负责各种数据库任务相关检查以及最重要的运行函数(Run),这个函数主要执行实际的数据库操作并且将结果存放在DSS数据系统中的数据库子系统数据字典,是真正的重要执行函数:

第三步:对于数据库接口类,它继承自数据库任务类,数据库任务类则再次继承于DSS任务类,同时,任务类与系统线程类互为友元类,在服务器初始化的时候,数据库任务类将会调用静态初始化函数开始启动数据库线程,同时因为系统线程类的入口函数为虚函数,因此数据库线程将运行自己的唯一线程,也就是数据库任务推送线程(将数据库任务推送进堆变量优先队列中):

第四步:任务类线程一直处于等待状态中,它会等待两种任务状态的到来,一种是在任务执行过程中返回大于0值的任务,这种类型的任务将被存放在堆变量类型(优先队列)的任务队列里,当时间片到达的时候,将优先弹出这个队列中的任务进行运行;第二种是普通任务的投递,这种类型的任务被投递到正常的任务队列中,当优先队列中不存在任务的时候将查找这个普通任务队列是否有时间片超时的任务,如果有的话则开始运行对应的运行函数:

第五步、如图2所示:当有一个需要被数据库操作中断的任务在任务类线程中执行的时候,她会返回一个以毫秒为单位的值将自己进行中断,中断之后任务类任务线程将会将其送进任务类线程中的堆变量(优先队列中),下一次当返回值(时间片超时)到达的时候,任务类将优先执行优先队列中的任务,只有当优先队列中的任务执行完之后才会执行普通任务队列中的任务。因此当前任务被抢占之后,将开始优先执行抢占任务也就是数据库数据库任务的真正执行者运行函数。最后当数据库数据库任务执行完成之后,数据通过数据字典送进数据区,重新等待原先被抢占的任务执行,此时原先任务将获得数据库数据:

数据库任务线程类还包括一个执行数据库语句函数,该执行数据库语句函数用于将数据库任务指针推进堆变量,同时增加长度,驱动任务线程类的入口函数进行工作

第六步、如图3系列(图3-1、3-2、3-3、3-4)所示:任务类线程中的入口函数如何将时间片已经到达的任务推送到任务类任务线程执行的过程,图3系列所示是如何使用优先队列的数据结构来实现优先级任务推送,优先队列是计算机科学中的一类抽象数据类型,优先队列中的每个元素都有各自的优先级,优先级最高的元素最先得到服务;优先级相同的元素按照其在优先队列中的顺序得到服务,优先队列往往用堆来实现。在本发明中,优先队列的优先级用任务中断后再次运行所需要等待的时间片表示,图3系列中如果所有节点的时间值(优先队列中元素的优先级)为0的话则表示数据库任务将立即被执行,如果为其他数值,则表示被中断的任务需要等待多久的时间片再次被执行。

第七步、如图4所示:在DSS框架Private.h文件中的回调函数结构中增加数据库数据库操作的回调函数定义,接着在Callbacks.h中增加数据库数据库操作函数声明,同时在Callbacks.cpp中实现声明函数,在QTSS.h中引用数据库操作函数的声明,最后在qtsserver.cpp中的初始化回调函数中完成对数据库操作函数的函数指针赋值,完成由DSS框架内部到DSS框架外部插件的API接口设计。当系统外部插件需要使用数据库功能,则调用系统内定义好的API接口,同时对数据字典进行抢占安全保护。

本发明上述Private.h文件、Callbacks.h文件、Callbacks.cpp文件均是DSS框架中已有定义文件,均分别具备其特有功能。

优选的,数据库任务线程类包括一个堆(堆变量、heap)数据结构的成员变量,即优先队列,这个优先队列是由一完全二叉树构造而成,该完全二叉树的父节点始终大于或者小于左右子节点,这个优先队列用于将时间片最近的数据库任务推往树根节点,同时也包括对于堆变量进行抢占保护的堆互斥量(heapMutex)以及驱动堆变量工作的堆信号量(heapCond)。

优选的,所述数据库任务线程类包括一个入口函数(Entry()),该函数用于判断是否存在任务元素,当任务堆长度是否大于0时存在任务元素,如果已经存在任务元素,则入口函数再判断当前任务元素中的时间片是否已经到达超时,如果当前任务的时间片已经超时则将当前任务发送到DSS框架中的任务线程中进行实际运行数据库任务;任务类线程一直处于等待状态中,她会等待两种任务状态的到来,一种是在任务执行过程中返回大于0值的任务,这种类型的任务将被存放在堆变量类型(优先队列)的任务队列里,当时间片到达的时候,将优先弹出这个队列中的任务进行运行。第二种是普通任务的投递,这种类型的任务被投递到正常的任务队列中,当优先队列中不存在任务的时候将查找这个普通任务队列是否有时间片超时的任务,如果有的话则开始运行对应的运行函数。

优选的,所述数据库任务类包括一个静态初始化函数(static void Initialize())和封装了数据库任务线程类中真正执行函数的执行数据库语句函数,该静态初始化函数在系统启动过程中系统初始化函数时被调用,调用该静态初始化函数时数据库任务推送线程开始运行;

该执行数据库语句函数作为数据库的API接口基础,在API将提供给DSS框架的外部插件使用时调用。

优选的,所述数据库任务类包括堆成员类,堆成员类作为数据库任务类(指针)的成员变量,也作为数据库任务线程类这个友元类的成员变量,堆成员变量具有保存任务指针的变量以及当前任务时间片的超时时间;

所述数据库任务类还包括数据库任务事件枚举结构,在任务事件枚举结构中定义当数据库任务实际被送入DSS工作线程运行时需要执行的事件定义。

优选的,数据库接口包括一个静态初始化函数,该静态初始化函数在数据库子系统正式启动之前预先调用,负责对数据库子系统的相关数据进行全局数据字典的开辟,这些数据字典将在DSS框架内部和外部插件进行交互使用。

优选的,数据库包括一个静态初始化函数、一个真正任务执行函数以及运行函数,该静态初始化函数进行任务的辅助信息初始化;该真正任务执行函数在DSS框架工作线程中将被提取出来执行;该运行函数执行数据库方式下的数据库操作,数据库操作为:首先获取SQL语句,然后送入数据库语句执行函数中,接着获取执行结果集计数以及最后结果存放进数据库接口中的数据字典变量;

对于数据库运行函数的结果集使用DSS框架中可变长度的字符串格式化类,这个类在构造函数的时候将会开辟预定于大小的空间用于存放结果集,如果结果集大于预定于大小的空间会自动开辟2倍原大小的空间。

优选的,对于数据库操作函数:执行数据库语句内部实现中使用数据库对象指向实际执行数据库语句的参数默认为0,也即另数据库任务需要从堆中立即被推进实际工作线程,同时回到调用模块中,数据库的API一旦调用就要使用返回一个以毫秒为单位的数值进行中断当前任务模块,因为数据库任务开始抢占,对于以毫秒为单位返回的这个值就是原任务需要等待重新执行的时间,这个时间需要根据当前需要对数据库操作的时间进行判断后设置,防止发生嵌套任务。

以上仅为本发明的具体实施例,并非对本发明的保护范围的限定。凡依本案的设计思路所做的等同变化,均落入本案的保护范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1