数据库连接方法及装置与流程

文档序号:12271570阅读:211来源:国知局
数据库连接方法及装置与流程

本申请涉及数据库技术领域,更具体地,是数据库连接方法及装置。



背景技术:

作业在处理过程中,需要访问数据库。在复杂的系统中,待处理作业数量较多,通常有上万甚至十几万条,每个作业都需要与数据库进行交互。虽然,批量调度系统可以调度作业以控制访问数据库的作业数量。但是,目前批量调度系统采用多线程的调度方式,即创建多个线程且每个线程调起一个作业,创建的线程数量一般会有几百个,这样,会有几百个作业同时访问数据库,访问数据库的作业数量仍然较多。

现有的多线程访问数据库的方式中,为每个线程创建一个数据库连接用于访问数据库,访问完成后再断开该数据库连接,其他线程需要访问数据库时,再重新创建数据库连接,频繁的建立及断开数据库连接,必然增大系统资源开销,降低系统的性能。



技术实现要素:

有鉴于此,本申请提供了一种数据库连接方法,用以解决频繁创建及关闭数据库连接造成的资源浪费。另外,本申请还提供了一种数据库连接装置,用以保证所述方法在实际中的应用及实现。

为实现所述目的,本申请提供的技术方案如下:

一种数据库连接方法,包括:

修改待连接的数据库中的头文件,以取消所述头文件中对数据库连接共享的限制;

若接收到线程连接所述数据库的请求,则查找预设的链表中首个未被线程占用的结构体节点;其中,所述链表用于表示数据库连接池,所述链表中的结构体节点用于表示数据库连接;

将所述结构体节点所对应的数据库连接分配给所述线程,并在所述结构体节点内记录所述数据库连接的分配信息;

触发所述线程使用所述数据库连接访问所述数据库,并在所述线程释放所述数据库连接后,在所述结构体节点内记录所述数据库连接的释放信息。

可选地,所述链表的设置步骤包括:

创建数据库连接;

创建用于记录所述数据库连接的基本信息的结构体节点;

将所述结构体节点添加到链表中。

可选地,数据库连接方法还包括:

遍历所述链表,以获得所述链表的各个结构体节点的分配信息及释放信息;

根据分配信息中的数据库连接开始占用时间点及释放信息中的数据库连接结束占用时间点,确定数据库连接的占用时长;

若所述占用时长超过预设占用时长阈值,则关闭所述占用时长对应的数据库连接,并重新创建所述数据库连接。

可选地,所述结构体节点内包含互斥锁及表示数据库连接是否可用的参数;该方法还包括:

在将所述结构体节点所对应的数据库连接分配给所述线程之前,对所述互斥锁进行加锁,并将所述表示数据库连接是否可用的参数设置为不可用;

在所述线程释放所述数据库连接后,将所述表示数据库连接是否可用的参数设置为可用,并对所述互斥锁进行解锁。

可选地,所述数据库为Sybase数据库,所述数据库连接方法是使用C语言的嵌入式SQL技术实现的。

本申请还提供了一种数据库连接装置,包括:

共享限制取消单元,用于修改待连接的数据库中的头文件,以取消所述头文件中对数据库连接共享的限制;

空闲连接查找单元,用于若接收到线程连接所述数据库的请求,则查找预设的链表中首个未被线程占用的结构体节点;其中,所述链表用于表示数据库连接池,所述链表中的结构体节点用于表示数据库连接;

空闲连接分配单元,用于将所述结构体节点所对应的数据库连接分配给所述线程,并在所述结构体节点内记录所述数据库连接的分配信息;

占用连接释放单元,用于触发所述线程使用所述数据库连接访问所述数据库,并在所述线程释放所述数据库连接后,在所述结构体节点内记录所述数据库连接的释放信息。

可选地,数据库连接装置还包括:链表设置单元,用于设置所述链表;

其中,所述链表设置单元具体包括:

数据库连接创建子单元,用于创建数据库连接;

结构体节点创建子单元,用于创建用于记录所述数据库连接的基本信息的结构体节点;

结构体节点添加子单元,用于将所述结构体节点添加到链表中。

可选地,数据库连接装置还包括:

连接信息获得单元,用于遍历所述链表,以获得所述链表的各个结构体节点的分配信息及释放信息;

连接时长确定单元,用于根据分配信息中的数据库连接开始占用时间点及释放信息中的数据库连接结束占用时间点,确定数据库连接的占用时长;

连接关闭单元,用于若所述占用时长超过预设占用时长阈值,则关闭所述占用时长对应的数据库连接,并重新创建所述数据库连接。

可选地,所述结构体节点内包含互斥锁及表示数据库连接是否可用的参数;该装置还包括:

加锁单元,用于在将所述结构体节点所对应的数据库连接分配给所述线程之前,对所述互斥锁进行加锁,并将所述表示数据库连接是否可用的参数设置为不可用;

解锁单元,用于在所述线程释放所述数据库连接后,将所述表示数据库连接是否可用的参数设置为可用,并对所述互斥锁进行解锁。

可选地,所述数据库为Sybase数据库,所述数据库连接装置是使用C语言的嵌入式SQL技术实现的。

由以上技术方案可知,本申请提供了一种数据库连接方法,该方法可以为当前的多个线程分配数据库连接,并且数据库连接使用完毕被释放后可以再次被分配给其他的线程,因此,该方法使数据库连接被多个线程共享,从而解决了多线程访问数据库时频繁开启、关闭数据库连接造成的资源浪费。

附图说明

为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。

图1为本申请提供的数据库连接池的创建流程图;

图2为本申请提供的数据库连接的流程图;

图3为本申请提供的数据库连接的监测流程图;

图4为本申请提供的数据库连接装置的结构示意图;

图5为本申请提供的数据库连接装置的另一结构示意图。

具体实施方式

下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

为了便于理解本方案,首先对可能用到的术语及概念进行解释。

多线程编程:多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

嵌入式SQL:指在程序中使用的SQL语句,更具体地,ESQL/C表示在C语言环境中的嵌入SQL语句。

互斥量:互斥量从本质上说是一把锁,在访问共享资源前对互斥量进行设置(加锁),在访问完成后释放(解锁)互斥量。

Sybase数据库:一种大型关系数据库系统。

本申请采用嵌入SQL技术实现数据库连接池,数据库连接池内创建有多个数据库连接,每个数据库连接均可以被多线程共享。数据库可以是但不限定于Sybase数据库,为了理解本技术方案,以下以Sybase数据库为例进行说明。

针对Sybase数据库的数据库连接不能共享的问题,发明人进行了研究并且发现,Sybase数据库具有头文件如头文件sybtestql.h,文件对线程间数据库连接共享进行了限制,使得每个数据库连接均被限制于当前连接数据库的一个线程,其他线程并不能使用该数据库连接。

为了保证创建的数据库连接池可以被多线程共享,需要修改Sybase的头文件,以取消头文件中对数据库连接共享的限制。具体地,发明人研究头文件后发现,头文件中包含以下代码段。

#ifndef CONNECTIONS_ARE_SHARED_ACROSS_THREADS

(*_sql)->connName.threadlen=(*_sql)->threadIdLen;

(*_sql)->connName.thread=(*_sql)->threadId;

#endif/*CONNECTIONS_ARE_SHARED_ACROSS_THREADS*/

此段代码的功能为将数据库连接限制在当前执行连接的线程中。因此,需要屏蔽此段代码,以取消对数据库连接的限制。

屏蔽的一种方式是,在头文件中增加编译参数,这样,在编译以上数据库连接方法对应的源代码时,编译参数可以用于屏蔽对上述代码的编译,编译参数可以是如下形式:

DCONNECTIONS_ARE_SHARED_ACROSS_THREADS。

编译后,便可以运行本申请提供的数据库连接方法,该方法可以是由基于C语言的嵌入SQL技术即ESQL技术实现的。

见图1,其示出了本申请提供的数据库连接池的创建流程,具体包括步骤S11~S13。

S11:创建数据库连接。

具体地,可以调用函数CreateConnectionPool创建数据库连接,该函数可以是使用ESQL语法编写的。例如,该函数可以是:

EXEC SQL CONNECT:szDbUser IDENTIFIED BY:szDbPwd AT:szCnnName USING:szDbServer;

其中,szDbUser表示连接数据库的用户名,szDbPwd表示连接数据库的密码,szCnnName表示数据库连接的名称,szDbServer表示数据库服务名。因此,上述代码的功能为:创建数据库连接szCnnName,该数据库连接可以通过用户名szDbUser及密码szDbPwd,访问数据库服务名szDbServer提供的数据库。

S12:创建用于记录数据库连接的基本信息的结构体节点。

其中,创建结构体用于记录数据库连接,一个结构体记录一个数据库连接,结构体可以作为链表中的一个节点,即链表中的每个节点记录一个数据库连接,则完整的链表即可以表示数据库连接池。另外,由于结构体作为链表中的节点,则该结构体可以具体称为结构体节点。

结构体节点中包含多个元素,用于记录数据库连接的多个基本信息。具体地,结构体节点的一种形式可以为:

其中,结构体节点的名称为ConnectionNode,connectName用于记录数据库连接的名称,threadName用于记录使用该数据库连接的线程的名称,互斥锁connectionLock及使用参数isAvailable用于确保该数据库连接在某一时刻只被一个线程占用,startTime用于记录该数据库连接的开始占用时间,endTime用于记录该数据库连接的释放时间,next指针用于指向下一数据库连接。

需要说明的是,创建结构体节点后,但该结构体节点所记录的数据库连接还未被线程占用前,该结构体节点中只有connectName的值为具体的数据库连接名称,其他元素的值此时为空。

结构体仅仅是记录数据库连接基本信息的一种数据结构,还可以是其他形式的数据结构。

S13:将结构体节点添加到链表中,该链表用于表示数据库连接池。

具体地,数据库连接池的具体数据结构可以如下所示:

其中,ConnectionsPool为数据库连接池结构体的名称,head表示链表的头结点,size表示链表中的节点个数,通过size可以确定数据库连接池中的数据库连接的个数。

以上步骤S11~S13可以创建数据库连接,并将数据库连接记录在链表的节点中,链表可以表示数据库连接池。数据库连接池建立后,可以供线程使用来访问数据库。

基于上述创建的数据库连接池,本申请还提供了一种数据库连接方法,以共享数据库连接池内的数据库连接。该方法可以使用但不限定于C语言的ESQL技术实现,访问的数据库可以是但不限定于Sybase数据库。

参见图2,其示出了数据库连接方法的流程,具体包括步骤S21~S25。

S21:若接收到线程连接数据库的请求,则查找链表中首个未被线程占用的结构体节点。

其中,批量调度系统创建多个线程后,每个线程调起一个作业,作业需要访问数据库,则线程向本方法的执行模块发送连接数据库的请求,以使该执行模块为各个线程查找数据库连接,以用于访问数据库。

首先,从链表的首个结构体节点开始遍历,以查找首个未被线程占用的结构体节点。

具体地,前已述及,结构体节点中包含多个元素,其中包含占用连接的线程名threadName及表示当前连接是否可用的参数isAvailable。因此,在遍历时,可以查找首个isAvailable为真(或为1)的结构体节点。

以上查找可以是但不限定于通过调用函数ConnectDbFromPool实现的。

S22:将查找到的结构体节点所表示的数据库连接分配给该线程。

其中,以结构体节点ConnectionNode为例,结构体节点中包含connectName这一参数,用于记录数据库连接的名称,根据该参数,便可以获取到结构体节点所表示的数据库连接。进而,将获取到的数据库连接分配给该线程。

获取空闲的数据库连接的代码可以如下:

EXEC SQL set connection:szCnnName。

S23:在查找到的结构体节点内记录数据库连接的分配信息。

其中,结构体节点内可以包含用于记录数据库连接分配信息的元素,根据步骤S22的分配操作,在结构体节点内记录分配信息。以上述结构体节点ConnectionNode为例,将线程的名称记录在threadName内,并将分配的时间点记录在startTime内,以表示数据库连接的开始占用时间点。

S24:触发该线程使用该数据库连接访问数据库。

其中,线程使用该数据库连接访问数据库,并在访问完毕后,释放该数据库连接。

S25:该线程释放该数据库连接后,在该结构体节点内记录数据库连接的释放信息。

其中,可以但不限定于通过调用函数ReleaseConnectionFromPool的方式释放数据库连接。

释放信息可以包括数据库连接的释放时间这一参数,将线程释放该数据库连接的时间记录在这一参数内。以上述结构体节点ConnectionNode为例,在线程释放数据库连接后,将释放时间记录在参数endTime内。

由以上技术方案可知,本申请提供的数据库连接方法可以使数据库连接被多个线程共享,以访问数据库,从而解决了多线程访问数据库时频繁开启、关闭数据库连接造成的资源浪费。数据库连接池内的数据库连接可以动态增加或减少,增加时只需新增结构体节点,并将该结构体节点添加到链表中即可,减少时只需删除链表中的结构体节点即可。

以上结构体节点记录的分配信息及释放信息,可以用于对数据库连接的可用性进行监测。

具体的监测方法流程可以参见图3,包括步骤S31~S33。

S31:遍历链表,以获得各个结构体节点的分配信息及释放信息。

S32:根据分配信息中的数据库连接开始占用时间点及释放信息中的数据库连接结束占用时间点,确定数据库连接的占用时长。

其中,将数据库连接结束占用时间点与数据库连接开始占用时间点之差,确定为数据库连接的占用时长。

S33:若占用时长超过预设占用时长阈值,则关闭该占用时长对应的数据库连接。

其中,监控数据库连接的使用情况,根据使用情况设置相应的占用时长阈值。若占用时长超过预设时长阈值,则表示该数据库连接处于不可用状态,进而关闭该数据库连接。进一步地,还可以再新建一个数据库连接放入数据库连接池中。

另外,还可以通过调用函数CheckConnectionFromPool实现对数据库连接名的监测。具体地,定时或者不定时地遍历链表,查找未被线程占用的数据库连接,若该数据库连接的名称存在异常,则重新创建该数据库连接,以保证该数据库连接的可用性。

另外,为了保证数据库连接操作的原子性,即保证一个线程单独占用一个数据库连接,可以对数据库连接进行控制。具体地:

在以上步骤S22将查找到的结构体节点所表示的数据库连接分配给该线程之后,还可以包括:对互斥锁进行加锁,并将该结构体节点内表示数据库连接是否可用的参数设置为不可用;在线程释放该数据库连接后,将该结构体节点内表示数据库连接是否可用的参数设置为可用,并对互斥锁进行解锁。

其中,以上述结构体节点ConnectionNode为例,结构体节点内表示数据库连接是否可用的参数为isAvailable,在分配该结构体节点对应的线程后,则将该参数的值设置为0或false等表示数据库连接不可用的值。并且,将互斥锁connectionLock加锁,以防止其他线程使用该结构体节点表示的数据库连接。

在该数据库连接被释放后,将结构体节点内表示数据库连接是否可用的参数的值设置为1或true等表示数据库连接可用的值。并且,将互斥锁connectionLock解锁,以使其他线程可以使用该结构体节点表示的数据库连接。

在对互斥锁加锁后,可以判断结构体节点是否可用,若可用则将结构体节点内表示数据库连接是否可用的参数设置为不可用,若不可用,则对互斥锁进行解锁。

总结以上本申请提供的技术方案可知,本申请至少具有如下优点:

1、可以应用到对Sybase数据库的多线程访问机制中。基于Sybase软件开发套件,能够无缝支撑对Sybase数据库的访问。

2、使用嵌入式SQL技术实现技术方案,能够全面支撑嵌入式SQL操作,保证已有嵌入式SQL程序平滑过渡。与现有技术相比,并不需了解数据库连接相关的API定义,实现了基于嵌入式SQL的灵活性数据库操作。

3、建立结构体节点对数据库连接进行管理,包括数据库连接的基本信息及使用信息。

4、以结构体节点为单位,通过互斥锁实现排他机制,以保证每个线程使用数据库连接的惟一性。

5、以结构体节点为单位,对数据库连接进行超时诊断及连接修复。

以下对本申请提供的数据库连接装置进行介绍,需要说明的是,有关数据库连接装置的说明可以参见上述数据库连接方法,以下并不赘述。

见图4,其示出了本申请提供的数据库连接装置的结构,具体包括:

可选地,数据库连接装置还可以包括:

共享限制取消单元401,用于修改所述数据库连接所连接的数据库中的头文件,以取消所述头文件中对数据库连接共享的限制;

空闲连接查找单元402,用于若接收到线程连接数据库的请求,则查找预设的链表中首个未被线程占用的结构体节点;其中,所述链表用于表示数据库连接池,所述链表中的结构体节点用于表示数据库连接;

空闲连接分配单元403,用于将所述结构体节点所对应的数据库连接分配给所述线程,并在所述结构体节点内记录所述数据库连接的分配信息;

占用连接释放单元404,用于触发所述线程使用所述数据库连接访问数据库,并在所述线程释放所述数据库连接后,在所述结构体节点内记录所述数据库连接的释放信息。

见图5,数据库连接装置在上述图4的基础上,还可以包括:链表设置单元405。

链表设置单元405,用于设置所述链表;其中,所述链表设置单元405具体可以包括:

数据库连接创建子单元,用于创建数据库连接;

结构体节点创建子单元,用于创建用于记录所述数据库连接的基本信息的结构体节点;

结构体节点添加子单元,用于将所述结构体节点添加到链表中。

可选地,上述的数据库连接装置还包括:

连接信息获得单元,用于遍历所述链表,以获得所述链表的各个结构体节点的分配信息及释放信息;

连接时长确定单元,用于根据分配信息中的数据库连接开始占用时间点及释放信息中的数据库连接结束占用时间点,确定数据库连接的占用时长;

连接关闭单元,用于若所述占用时长超过预设占用时长阈值,则关闭所述占用时长对应的数据库连接。

可选地,所述结构体节点内包含互斥锁及表示数据库连接是否可用的参数;该装置还包括:

加锁单元,用于在将所述结构体节点所对应的数据库连接分配给所述线程后,将所述表示数据库连接是否可用的参数设置为不可用,并对所述互斥锁进行加锁;

解锁单元,用于在所述线程释放所述数据库连接后,将所述表示数据库连接是否可用的参数设置为可用,并对所述互斥锁进行解锁。

需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。

还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括上述要素的过程、方法、物品或者设备中还存在另外的相同要素。

对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本申请。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。

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