数据库连接的分配和回收方法_2

文档序号:8487912阅读:来源:国知局
5]通过数据库中间件进行数据库操作的时候,该数据库操作是针对某个具体的数据库。因此,在数据库中间件请求连接的时候都会指定具体的数据库名。
[0046]连接池单元接收连接请求,该连接请求包含数据库名。然后,连接池单元开始连接分配的过程。下面结合图3描述分配连接的过程。
[0047]在步骤S3001,连接池单元根据该数据库名到逻辑连接池中去寻找相应数据库所对应的队列。
[0048]在步骤S3002,确定逻辑连接池中是否存在该数据库对应的队列。如果存在,则在步骤S3011获取该数据库对应的队列并且转到步骤S3013,否则转步骤S3021。
[0049]在步骤S3013,确定该数据库对应的队列是否为空。若不空,则转到步骤S3015,否则转到步骤S3021。
[0050]在步骤S3015,从该数据库对应的队列中取得一个连接,并同时将该连接从该队列移除,然后转到步骤S3017。
[0051]在步骤S3017,在全局队列中移除所取得的连接。并且接着在步骤S3019把该连接返回给请求连接的应用。
[0052]根据本发明,在具体实现的时候,可以直接以数组来表示逻辑连接池中数据库对应的队列。分配连接的时候从数组的末尾获取,在回收连接的时候(具体见后面回收连接的步骤),直接将连接置于数组的末尾即可,从而保证优先获取最不活跃的连接。
[0053]如果在步骤S3013判定逻辑连接池中存在该数据库对应的队列,但此时该队列为空,则需要转到步骤S3021,使得到全局队列中去获取连接。
[0054]在步骤S3021判断全局队列是否为空。当非空时,转到步骤S3023。
[0055]在步骤S3023,从全局队列的末尾获取未被使用的连接,或者是其它数据库对应的队列中最不活跃的连接(如果是后者的情况,要解除该连接与该其他数据库的对应关系),并且将该连接从全局队列中移除。
[0056]接着在步骤S3025建立并记录该连接与该数据库的对应关系。例如,通过“usedb”操作来建立这种对应关系,其中db是具体的数据库名。这样,使得该连接和相应的数据库关联,后续即可通过该连接正常操作该数据库了。然后转步骤S3019把该连接返回给请求连接的应用。
[0057]如果在步骤S3021判定全局队列为空,即全局队列中所有的连接都已经被分配了,转步骤S3031判断活跃连接总数有没有达到连接池总的连接数额度。如果还没有达到总的连接数额度,则转步骤S3033,直接创建新的连接,然后依次转步骤S3025、S3019,建立并记录该新连接和该数据库的对应关系,并向调用者返回该连接。
[0058]如果在步骤S3031判定活跃连接数已经达到了连接池的连接总数的限制,则在步骤S3041来发出连接数报警。
[0059]可选地,在步骤S3043查看是否还有弹性连接额度可以使用。弹性连接是指在连接总数限制之外的用于应对临时增大的突发的访问量而创建的连接。这些连接会在使用完之后就释放,保证对数据库的连接压力尽可能的低。
[0060]如果在步骤S3043判定还可以创建弹性连接,则转步骤S3033来创建新的连接,然后转步骤S3025,将新的连接和该数据库对应上并记录该对应关系。然后依次转步骤S3025、S3019,建立并记录该新连接和该数据库的对应关系,并向调用者返回该连接。
[0061]如果在步骤S3043判定弹性连接的额度都已经用完了,则在步骤S3045返回获取连接失败的异常消息。
[0062]因为对连接池进行了分层处理,所在获取具体某个数据库的连接的时候,如果逻辑连接池中该数据库对应的队列里的连接不够用,可以去全局连接池的全局队列中获取未被使用或者是其它数据库对应的队列中最不活跃的连接,从而保证了连接资源的利用最终会趋于合理的状态,即不活跃的数据库对应的队列中的连接会被转移到活跃的数据库对应的队列中。
[0063](3)回收连接
[0064]从连接池中获取到的连接在使用之后需要释放给连接池。在连接池回收连接的时候需要将连接正确置于连接池的合理位置。回收的位置主要包括两处:一个是在全局连接池的全局队列中的位置,另一个是在逻辑连接池中相应队列中的位置。
[0065]下面结合图4描述回收连接的过程。
[0066]在连接释放给连接池的时候,因为每个使用过的连接都是和具体的数据库有对应关系,所以首先在步骤S4001获取该连接对应的数据库的信息。
[0067]连接被实际回收之前,在步骤S4002判断当前连接池中的连接总数是否已经达到阈值。
[0068]如果在步骤S4002判定当前连接池中的所有的连接数已经大于等于连接池总的连接数额度,这表明在获取连接的时候已经创建出了临时的弹性连接,在这种情况下,则转步骤S4008直接关闭该连接,从而保证整个连接池的连接总数是可控的。
[0069]如果在步骤S4002判定当前连接池的连接数是小于总的连接数额度的,则转步骤S4003用于把该连接返回到逻辑连接池中。
[0070]在步骤S4003判断该连接对应的数据库的队列是否存在,如果存在则转步骤S4006,直接把该连接放回到该数据库的队列中。具体实现可直接将该连接置于表示该数据库的队列的末尾即可。
[0071]如果在步骤S4003判定逻辑连接池中不存在该数据库对应的队列,则转步骤S4004,为该数据库创建一个队列,然后在步骤S4005将该数据库标示及对应的队列添加到逻辑连接池中,然后转步骤S4006再将该连接返回到对应的数据库的(新创建的)队列中。
[0072]将连接返回到逻辑连接池中以后,在步骤S4007把连接返回到全局连接池的全局队列中。例如,当全局队列采用LRU链表表示,则将连接放到LRU链表的头部,即第一个元素位置。
[0073]尽管结合附图详细描述了本发明的实施例,但实施例仅用于解释和说明本发明,而不是用于限制本发明。本发明的范围由权利要求书来限定,其中某些要素的改变、替换等是显而易见的。
【主权项】
1.一种利用数据库连接池分配连接的方法,所述数据库连接池包括全局连接池和逻辑连接池,所述全局连接池包括全局队列,所述逻辑连接池包括各数据库对应的队列, 所述方法包括步骤: 接收连接请求,该连接请求包含对应数据库的数据库名; 当所述逻辑连接池中存在该数据库对应的队列并且该队列非空,则从该队列中取得一个连接,并同时将该连接从该队列中和全局队列中移除,并且返回该连接; 当所述逻辑连接池中不存在该数据库对应的队列或者尽管存在但该队列为空,则确定所述全局队列是否为空; 当所述全局队列非空,则取出所述全局队列的尾部的连接,建立并保存该连接与所述数据库的对应关系,并且返回该连接,其中当存在该连接与其他数据库的对应关系时,解除该连接与该其他数据库的对应关系; 当所述全局队列为空,则判定当前活动连接数是否大于预定的阈值; 当活动连接数不大于预定的阈值,则创建新的连接,建立并保存该连接与所述数据库的对应关系,并且返回该连接; 当活动连接数大于预定的阈值,则发出连接数报警。
2.根据权利要求1所述的方法,在发出连接数报警的步骤之后还包括如下步骤: 确定是否有弹性连接额度, 当有弹性连接额度可使用,则创建新的连接,建立并保存该连接与所述数据库的对应关系,并且返回该连接; 当没有弹性连接额度,则返回获取连接失败的异常消息。
3.根据权利要求1所述的方法,所述全局队列是链表或数组。
4.根据权利要求1所述的方法,所述全局队列采用LRU链表的形式。
5.根据权利要求1所述的方法,所述逻辑连接池包括的队列是数组。
6.一种利用数据库连接池回收连接的方法,所述数据库连接池包括全局连接池和逻辑连接池,所述全局连接池包括全局队列,所述逻辑连接池包括各数据库对应的队列, 所述方法包括步骤: 接收释放给所述数据库连接池的连接,并获取该连接对应的数据库的信息; 确定连接池连接总数是否已经达到预定连接数阈值; 当所述连接池连接数大于等于所述连接数阈值,则关闭该连接; 当所述连接池连接数小于所述连接数阈值并且所述逻辑连接池中存在该连接对应的数据库的队列,则把该连接置于该数据库的队列的尾部,并且把该连接置于所述全局队列的头部; 当当前连接池连接数小于所述连接数阈值并且所述逻辑连接池中不存在该连接对应的数据库的队列,则为该数据库创建队列,把该队列添加到所述逻辑连接池中,把该连接置于该队列的尾部,并且把该连接置于所述全局队列的头部。
7.根据权利要求6所述的方法,所述全局队列是链表或数组。
8.根据权利要求6所述的方法,所述全局队列采用LRU链表的形式。
9.根据权利要求6所述的方法,所述逻辑连接池包括的队列是数组。
【专利摘要】本发明涉及一种数据库连接的分配和回收方法,本发明的方法利用数据库连接池,所述数据库连接池包括全局连接池和逻辑连接池,全局连接池包括队列,逻辑连接池包括对应各数据库的队列。利用两层连接池的队列结构,可以通过全局连接池快速找到最不活跃的数据库对应的队列中的连接或者是从未被使用连接,从而保证了各数据库间连接资源的充分利用。
【IPC分类】G06F17-30
【公开号】CN104809247
【申请号】CN201510252772
【发明人】张成远, 田琪, 季锡强
【申请人】北京京东尚科信息技术有限公司, 北京京东世纪贸易有限公司
【公开日】2015年7月29日
【申请日】2015年5月18日
当前第2页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1