掌桥专利:专业的专利平台
掌桥专利
首页

一种基于锁的连接池实现并发请求的方法及其系统

文献发布时间:2023-06-19 09:35:27


一种基于锁的连接池实现并发请求的方法及其系统

技术领域

本发明涉及计算机通讯技术领域,特别是一种基于锁的连接池实现并发请求的方法及其系统。

背景技术

目前连接池技术的核心思想是:连接复用,通过建立一个数据库连接池以及一套连接使用、分配、管理策略,使得该连接池中的连接可以得到高效、安全的复用,避免了数据库连接频繁建立、关闭的开销。其中连接池的分配、释放策略对于有效复用连接非常重要,目前行业内一般采用Reference Counting(引用记数)的方式进行处理,虽然这个Reference Counting(引用记数)简单直观,实现方便,但是它却存在一个致命的缺陷,就是容易造成内存泄露。就是如果存在循环引用,那么Reference Counting就可能导致内存泄露。

发明内容

为克服上述问题,本发明的目的是提供一种基于锁的连接池实现并发请求的方法,可有效解决内存泄露问题,同时避免反复地建立和销毁连接,提升系统的性能。

本发明采用以下方案实现:一种基于锁的连接池实现并发请求的方法,所述方法包括如下步骤:

步骤S1、设置一锁的连接池,所述连接池中包含有锁数组和连接数组,所述锁数组与连接数组一一对应,连接池中有N个连接,则连接池中的每一个连接都对应创建一个连接数组的单元,其中锁数组设置有可用状态和锁状态,锁数组中的锁为可用状态,则表示对应的连接数组的单元没有被使用,锁数组中的锁为锁状态,则表示对应的连接数组的单元被使用;

步骤S2、外部站点请求访问数据库缓存或者服务时,先初始化连接池,将锁数组中的每一个锁置为可用的状态;

步骤S3、外部站点请求访问时,调用GetConnection的接口进行拿连接,即获得一个可用的连接,该连接的连接数组单元对应的锁数组的锁置为锁状态;

步骤S4、请求完数据库缓存或者服务后用完了某一连接,则将该连接进行放回操作,即将连接的连接数组单元所对应的锁数组的锁恢复为可用状态。

进一步的,所述步骤S3进一步具体为:外部站点请求访问时,调用GetConnection的接口进行拿连接,先遍历锁数组,锁数组与连接数组是一一对应的,有多少个连接就有多少个锁;如果在遍历的过程中发现某一个锁元素是未锁状态,就将这个锁锁住,并把锁对应的连接返回给调用方,让调用方去操纵下游的数据库缓存或者是服务;当前连接数组的单元被锁住以后,下一个来拿连接的线程,就不会请求这个连接数组。

进一步的,所述步骤S4进一步具体为:连接进行放回操作后,遍历连接数组,去找连接数组中的哪一个单元是放回的连接,把该单元对应的锁置为可用状态,让这个连接能够被后续的工作行程复用。

本发明还提供了一种基于锁的连接池实现并发请求的系统,所述系统包括连接池设置模块、初始化模块、拿连接模块、放回连接模块;

所述连接池设置模块,用于设置一锁的连接池,所述连接池中包含有锁数组和连接数组,所述锁数组与连接数组一一对应,连接池中有N个连接,则连接池中的每一个连接都对应创建一个连接数组的单元,其中锁数组设置有可用状态和锁状态,锁数组中的锁为可用状态,则表示对应的连接数组的单元没有被使用,锁数组中的锁为锁状态,则表示对应的连接数组的单元被使用;

所述初始化模块,用于外部站点请求访问数据库缓存或者服务时,先初始化连接池,将锁数组中的每一个锁置为可用的状态;

所述拿连接模块,用于外部站点请求访问时,调用GetConnection的接口进行拿连接,即获得一个可用的连接,该连接的连接数组单元对应的锁数组的锁置为锁状态;

所述放回连接模块,用于请求完数据库缓存或者服务后用完了某一连接,则将该连接进行放回操作,即将连接的连接数组单元所对应的锁数组的锁恢复为可用状态。

进一步的,所述拿连接模块的实现方式进一步具体为:外部站点请求访问时,调用GetConnection的接口进行拿连接,先遍历锁数组,锁数组与连接数组是一一对应的,有多少个连接就有多少个锁;如果在遍历的过程中发现某一个锁元素是未锁状态,就将这个锁锁住,并把锁对应的连接返回给调用方,让调用方去操纵下游的数据库缓存或者是服务;当前连接数组的单元被锁住以后,下一个来拿连接的线程,就不会请求这个连接数组。

进一步的,所述放回连接模块的实现方式进一步具体为:连接进行放回操作后,遍历连接数组,去找连接数组中的哪一个单元是放回的连接,把该单元对应的锁置为可用状态,让这个连接能够被后续的工作行程复用。

本发明的有益效果在于:本发明设置一锁的连接池,所述连接池中包含有锁数组和连接数组,所述锁数组与连接数组一一对应,连接池中有N个连接,则连接池中的每一个连接都对应创建一个连接数组的单元,其中锁数组设置有可用状态和锁状态,通过锁机制的连接池的分配、释放策略,可有效解决内存泄露问题,且流程简单,同时避免反复地建立和销毁连接,提升系统的性能。

附图说明

图1是本发明的方法流程示意图。

图2是本发明的一具体实施例的流程示意图。

图3是本发明的系统原理框图。

具体实施方式

下面结合附图对本发明做进一步说明。

请参阅图1所示,本发明的一种基于锁的连接池实现并发请求的方法,所述方法包括如下步骤:

步骤S1、设置一锁的连接池,所述连接池中包含有锁数组和连接数组,所述锁数组与连接数组一一对应,连接池中有N个连接,则连接池中的每一个连接都对应创建一个连接数组的单元,其中锁数组设置有可用状态和锁状态,锁数组中的锁为可用状态,则表示对应的连接数组的单元没有被使用,锁数组中的锁为锁状态,则表示对应的连接数组的单元被使用;

步骤S2、外部站点请求访问数据库缓存或者服务时,先初始化连接池,将锁数组中的每一个锁置为可用的状态;

步骤S3、外部站点请求访问时,调用GetConnection的接口进行拿连接,即获得一个可用的连接,该连接的连接数组单元对应的锁数组的锁置为锁状态;

步骤S4、请求完数据库缓存或者服务后用完了某一连接,则将该连接进行放回操作,即将连接的连接数组单元所对应的锁数组的锁恢复为可用状态。

下面结合一具体实施例对本发明作进一步说明:

请参阅图2所示,本发明的一种基于锁的连接池实现并发请求的方法,

步骤1:设置连接池

设置一锁的连接池,所述连接池中包含有锁数组和连接数组,所述锁数组与连接数组一一对应,连接池中有N个连接,则连接池中的每一个连接都对应创建一个连接数组的单元,

步骤2:初始化连接池

首先是初始化,假设连接池中有N个连接,连接池数组中的每一个连接都创建(NEW)一个,并且和下游的数据库缓存或服务进行真正的连接,然后同时把锁数组中的每一个锁置为可用的状态。其中方案中介绍的锁直接用0和1去做伪代码的实现(0代表可用状态;1代表锁状态)。

步骤3:拿连接

拿连接GetConnection的接口,如果上游调用GetConnection的接口,会返回一个可用的连接。过程是先遍历是锁数组,锁数组与连接数组是一一对应的,有多少个连接就有多少个锁。如果在遍历的过程中发现某一个锁元素是0(该连接没有被使用,是未锁状态),就将这个锁锁住,并把锁对应的连接返回给调用方,让它去操纵下游的数据库缓存或者是服务。当前被锁住以后,下一个来拿连接的线程,因为这个锁被锁住了就不会返回,对应的这个连接。可以简单的理解为一个找可用连接,锁住并返回连接的一个过程。

步骤4:放回连接

如果调用方用完了这个连接,要把这个连接放回,这个连接所对应的锁就恢复可用状态,以便他给其他的线程去使用这个连接。数据访问层会遍历连接数组,去找连接数组中的哪一个单元是放回的连接,把对应的锁置为可用状态,让这个连接能够被后续的工作行程复用。所以放回连接,它是一个找到连接,并把锁释放的过程。

如图2,连接池基本架构包括“3个核心接口”、“2个核心数据结构”

3个核心接口介绍如下:

第一个接口是初始化,在服务启动的时候,初始化好与下游数据库缓存或者是服务的连接速度。

第二个核心接口是拿连接(GetConnection)。每当你要请求访问下游数据库缓存或者是服务的时候,不是去每次都connect,它建立一个新的连接,而是通过连接池的getconnection来拿一个接口。

第三个接口是释放连接(FreeConnection),每次请求完数据库缓存或者是服务的时候,不是close一个连接,而是把连接放回连接池。这是连接池组件需要提供的,至少必须要有这三个核心接口。

2个核心数据结构介绍如下:

1、锁数组

2、连接数组

解决多个请求并发的使用会出现问题,所以需要锁数组,来做互斥。图2中连接数组的每一个方格即为连接数组的单元。

请参阅图3所示,本发明还提供了一种基于锁的连接池实现并发请求的系统,所述系统包括连接池设置模块、初始化模块、拿连接模块、放回连接模块;

所述连接池设置模块,用于设置一锁的连接池,所述连接池中包含有锁数组和连接数组,所述锁数组与连接数组一一对应,连接池中有N个连接,则连接池中的每一个连接都对应创建一个连接数组的单元,其中锁数组设置有可用状态和锁状态,锁数组中的锁为可用状态,则表示对应的连接数组的单元没有被使用,锁数组中的锁为锁状态,则表示对应的连接数组的单元被使用;

所述初始化模块,用于外部站点请求访问数据库缓存或者服务时,先初始化连接池,将锁数组中的每一个锁置为可用的状态;

所述拿连接模块,用于外部站点请求访问时,调用GetConnection的接口进行拿连接,即获得一个可用的连接,该连接的连接数组单元对应的锁数组的锁置为锁状态;

所述放回连接模块,用于请求完数据库缓存或者服务后用完了某一连接,则将该连接进行放回操作,即将连接的连接数组单元所对应的锁数组的锁恢复为可用状态。

其中,所述拿连接模块的实现方式进一步具体为:外部站点请求访问时,调用GetConnection的接口进行拿连接,先遍历锁数组,锁数组与连接数组是一一对应的,有多少个连接就有多少个锁;如果在遍历的过程中发现某一个锁元素是未锁状态,就将这个锁锁住,并把锁对应的连接返回给调用方,让调用方去操纵下游的数据库缓存或者是服务;当前连接数组的单元被锁住以后,下一个来拿连接的线程,就不会请求这个连接数组。

其中,所述放回连接模块的实现方式进一步具体为:连接进行放回操作后,遍历连接数组,去找连接数组中的哪一个单元是放回的连接,把该单元对应的锁置为可用状态,让这个连接能够被后续的工作行程复用。

以上所述仅为本发明的较佳实施例,凡依本发明申请专利范围所做的均等变化与修饰,皆应属本发明的涵盖范围。

相关技术
  • 一种基于锁的连接池实现并发请求的方法及其系统
  • 一种基于Jedis的将多线程并发请求合并批量提交并分发结果的实现方法
技术分类

06120112225548