CN109284311B - 一种获取数据库连接的方法和装置 - Google Patents
一种获取数据库连接的方法和装置 Download PDFInfo
- Publication number
- CN109284311B CN109284311B CN201810925115.XA CN201810925115A CN109284311B CN 109284311 B CN109284311 B CN 109284311B CN 201810925115 A CN201810925115 A CN 201810925115A CN 109284311 B CN109284311 B CN 109284311B
- Authority
- CN
- China
- Prior art keywords
- database
- database connection
- threadlocal
- connections
- thread
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供了一种获取数据库连接的方法和装置,将设定数量的数据库连接存储于数据库连接池,为构建的每一个线程创建对应的ThreadLocal对象;当线程接收到服务请求时,检测线程对应的ThreadLocal对象中是否存储有数据库连接,如果是,则获取ThreadLocal对象中存储的数据库连接;否则,将数据库连接池中存储的一个数据库连接转存到ThreadLocal对象;当监测到线程结束服务时,将线程对应的ThreadLocal对象存储的数据库连接,返回给数据库连接池,并释放ThreadLocal对象。本发明提供的方案避免了多个处理线程获取相同的数据库连接,从而降低了数据库中数据混乱的风险。
Description
技术领域
本发明涉及计算机技术领域,特别涉及一种获取数据库连接的方法和装置。
背景技术
对于javaweb应用来说,在通过客户端或者终端浏览器发起访问请求时,服务端的容器(tomcat)解析接收到的访问请求,并将解析出的访问请求发送给对应的连接器/连接接口(servlet),即服务器为访问请求创建出处理线程,处理线程通过获取数据库连接,以对数据库中的数据进行增、删、改、查等操作。
目前获取数据库连接的方式主要包括两种,第一种是当处理线程创建后,现为处理线程创建数据库连接,第二种是将一定数量的数据库连接存储在数据库连接池中,处理线程直接从连接池获取数据库连接即可。当有大量的访问请求时,即当有大量的处理线程要获取数据连接时,第一种方法会出现频繁的创建和销毁数据库连接,造成数据库堵塞以及数据库出现性能瓶颈的问题。第二种方法虽然解决了数据库堵塞以及数据库出现性能瓶颈的问题,但是,多个相同功能的处理线程,可能会从数据库连接池中取到相同的数据库连接,对数据库中的数据进行增、删、改、查等操作,导致数据库中的数据混乱。
发明内容
本发明实施例提供了一种获取数据库连接的方法和装置,避免了多个处理线程同时通过相同的数据库连接处理数据库数据,从而降低了数据库中数据混乱的风险。
一种获取数据库连接的方法,将设定数量的数据库连接存储于数据库连接池,还包括:
当监测到至少一个线程构建时,为构建的每一个所述线程创建对应的ThreadLocal对象;
当所述线程接收到外部web应用发送的服务请求时,检测所述线程对应的ThreadLocal对象中是否存储有数据库连接,如果是,则直接获取所述ThreadLocal对象中存储的所述数据库连接;否则,将所述数据库连接池中存储的一个数据库连接转存到所述ThreadLocal对象;
当监测到所述线程结束服务时,将所述线程对应的所述ThreadLocal对象存储的所述数据库连接,返回给所述数据库连接池,并释放所述ThreadLocal对象。
可选地,上述方法进一步包括:为所述数据库连接池构建一个排队队列;
在检测到所述线程对应的ThreadLocal对象中没有数据库连接之后,在将所述数据库连接池中存储的一个数据库连接转存到所述ThreadLocal对象之前,进一步包括:
所述ThreadLocal对象进入所述排队队列;
所述将所述数据库连接池中存储的一个数据库连接转存到所述ThreadLocal对象,包括:
当所述排队队列中包含有至少两个ThreadLocal对象时,按照至少两个所述ThreadLocal对象进入所述排队队列的时间顺序,将所述数据库连接池中一个未被占用的数据库连接转存到所述ThreadLocal对象。
可选地,在所述ThreadLocal对象进入所述排队队列之后,在所述将所述数据库连接池中一个未被占用的数据库连接转存到所述ThreadLocal对象之前,进一步包括:
当一个目标ThreadLocal对象在所述排队队列中的排队时长达到排队时长阈值时,
按照所述目标ThreadLocal对象在所述排队队列中的位置,计算增补数量;
根据所述增补数量,为所述数据库连接池增补数据库连接;
对所述排队队列中各个ThreadLocal对象的排队时长重新计时。
可选地,所述按照所述目标ThreadLocal对象在所述排队队列中的位置,计算增补数量,包括:
当数据库连接的当前总个数等于预设的所述数据库连接池的最大连接数时,增补数量为0;
当数据库连接的当前总个数小于预设的所述数据库连接池的最大连接数时,根据下述计算公式组,计算增补数量;
其中,z表征增补数量,K表征预设的所述数据库连接池的最大连接数;v表征数据库连接的当前总个数;x表征所述排队队列中位于所述目标ThreadLocal对象之前的ThreadLocal对象的个数;y表征所述排队队列中位于所述目标ThreadLocal对象之后的ThreadLocal对象的个数;α表征用户设定的不小于0且不大于1的常数。
可选地,上述方法进一步包括:
针对预设的至少两个统计周期中的每一个统计周期,执行:统计所述数据库连接池中剩余的数据库连接个数的最小值;
利用统计出的每一个所述统计周期中所述数据库连接池中剩余的数据库连接个数的最小值,更新所述设定数量;
当更新后的设定数量大于数据库连接的当前总个数时,为所述数据库连接池构建并存储(m-v)个新的数据库连接;
当更新后的设定数量小于数据库连接的当前总个数时,为所述数据库连接池释放(v-m)个数据库连接,其中,m表征更新后的设定数量,v表征数据库连接的当前总个数。
可选地,
所述利用统计出的每一个所述统计周期中所述数据库连接池中剩余的数据库连接个数的最小值,更新所述设定数量,包括:
利用下述设定数量计算公式组,计算新的设定数量,并利用计算出的新的设定数量更新原来的设定数量;
其中,k表征预设的所述数据库连接池的最小空闲连接数;T表征统计周期总个数;v表征数据库连接的当前总个数;si表征统计出的统计周期i中所述数据库连接池中剩余的数据库连接个数的最小值,i取值为1至T的正整数;K表征预设的所述数据库连接池的最大连接数;R表征更新后的设定数量。
可选地,所述数据库连接池,包括:Durid数据库连接池。
一种获取数据库连接的装置,包括:连接构建单元、数据库连接池、访问处理单元和释放单元,其中,
所述连接构建单元,用于构建设定数量的数据库连接;
所述数据库连接池,用于存储所述连接构建单元构建的所述数据库连接;
所述访问处理单元,用于当监测到至少一个线程构建时,为构建的每一个所述线程创建对应的ThreadLocal对象,当所述线程接收到外部web应用发送的服务请求时,检测所述线程对应的ThreadLocal对象中是否存储有数据库连接,如果是,则直接获取所述ThreadLocal对象中存储的所述数据库连接;否则,将所述数据库连接池中存储的一个数据库连接转存到所述ThreadLocal对象;
所述释放单元,用于当监测到所述线程结束服务时,将所述线程对应的所述ThreadLocal对象存储的所述数据库连接,返回给所述数据库连接池,并释放所述ThreadLocal对象。
可选地,上述装置进一步包括:增补数量计算单元,其中,
所述访问处理单元,进一步用于:在检测到所述线程对应的ThreadLocal对象中没有数据库连接之后,控制所述ThreadLocal对象进入预先构建的排队队列;当所述排队队列中包含有至少两个ThreadLocal对象时,按照至少两个所述ThreadLocal对象进入所述排队队列的时间顺序,将所述数据库连接池中一个未被占用的数据库连接转存到所述ThreadLocal对象;当一个目标ThreadLocal对象在所述排队队列中的排队时长达到排队时长阈值时,触发所述增补数量计算单元,并对所述排队队列中各个ThreadLocal对象的排队时长重新计时;
所述增补数量计算单元,用于当数据库连接的当前总个数等于预设的所述数据库连接池的最大连接数时,增补数量为0;当数据库连接的当前总个数小于预设的所述数据库连接池的最大连接数时,根据下述计算公式组,计算增补数量;
其中,z表征增补数量,K表征预设的所述数据库连接池的最大连接数;v表征数据库连接的当前总个数;x表征所述排队队列中位于所述目标ThreadLocal对象之前的ThreadLocal对象的个数;y表征所述排队队列中位于所述目标ThreadLocal对象之后的ThreadLocal对象的个数;α表征用户设定的不小于0且不大于1的常数;
所述连接构建单元,进一步用于根据所述增补数量计算单元计算出的增补数量,为所述数据库连接池增补数据库连接。
可选地,上述装置进一步包括:更新单元,其中,
所述更新单元,用于针对预设的至少两个统计周期中的每一个统计周期,执行:统计所述数据库连接池中剩余的数据库连接个数的最小值;利用统计出的每一个所述统计周期中所述数据库连接池中剩余的数据库连接个数的最小值,更新所述设定数量,当所述更新单元更新后的设定数量大于数据库连接的当前总个数时,触发所述连接构建单元,当更新后的设定数量小于数据库连接的当前总个数时,触发所述数据库连接池;
所述连接构建单元,进一步用于当接收到所述更新单元触发时,构建(m-v)个新的数据库连接,并将构建的(m-v)个新的数据库连接存储到所述数据库连接池;
所述数据库连接池,进一步用于当接收到所述更新单元触发时,释放(v-m)个数据库连接;
其中,m表征更新后的设定数量,v表征数据库连接的当前总个数。
可选地,
所述更新单元,用于利用下述设定数量计算公式组,计算新的设定数量,并利用计算出的新的设定数量更新原来的设定数量;
其中,k表征预设的所述数据库连接池的最小空闲连接数;T表征统计周期总个数;v表征数据库连接的当前总个数;si表征统计出的统计周期i中所述数据库连接池中剩余的数据库连接个数的最小值,i取值为1至T的正整数;K表征预设的所述数据库连接池的最大连接数;R表征更新后的设定数量。
可选地,所述数据库连接池,包括:Durid数据库连接池。
本发明实施例提供了一种获取数据库连接的方法和装置,该获取数据库连接的方法,通过将设定数量的数据库连接存储于数据库连接池,当监测到至少一个线程构建时,为构建的每一个所述线程创建对应的ThreadLocal对象;当所述线程接收到外部web应用发送的服务请求时,检测所述线程对应的ThreadLocal对象中是否存储有数据库连接,如果是,则直接获取所述ThreadLocal对象中存储的所述数据库连接;否则,将所述数据库连接池中存储的一个数据库连接转存到所述ThreadLocal对象;当监测到所述线程结束服务时,将所述线程对应的所述ThreadLocal对象存储的所述数据库连接,返回给所述数据库连接池,并释放所述ThreadLocal对象,由于被线程调用的数据库连接是进入到ThreadLocal对象进行存储,而一个线程对应一个ThreadLocal对象,这就保证分配给一个线程的数据库连接不会再分配给其他的线程,避免了多个处理线程同时通过相同的数据库连接处理数据库数据,从而降低了数据库中数据混乱的风险。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明一个实施例提供的一种获取数据库连接的方法的流程图;
图2是本发明另一个实施例提供的一种获取数据库连接的方法的流程图;
图3是本发明一个实施例提供的一种获取数据库连接装置所在架构的结构示意图;
图4是本发明一个实施例提供的一种获取数据库连接装置的结构示意图;
图5是本发明另一个实施例提供的一种获取数据库连接装置的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例,基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
如图1所示,本发明实施例提供了一种获取数据库连接的方法,该方法可以包括以下步骤:
步骤101:将设定数量的数据库连接存储于数据库连接池;
步骤102:当监测到至少一个线程构建时,为构建的每一个所述线程创建对应的ThreadLocal对象;
步骤103:当所述线程接收到外部web应用发送的服务请求时,检测所述线程对应的ThreadLocal对象中是否存储有数据库连接,如果是,则执行步骤104;否则,执行步骤105;
步骤104:直接获取所述ThreadLocal对象中存储的所述数据库连接,并执行步骤106;
步骤105:将所述数据库连接池中存储的一个数据库连接转存到所述ThreadLocal对象,并获取所述ThreadLocal对象中存储的所述数据库连接;
步骤106:当监测到所述线程结束服务时,将所述线程对应的所述ThreadLocal对象存储的所述数据库连接,返回给所述数据库连接池,并释放所述ThreadLocal对象。
可以理解地,上述步骤104之后执行步骤106,以及步骤105之后执行步骤106是两种实现方式,一般来说,对于线程结束服务时,线程对应的ThreadLocal对象存储有数据库连接,该将数据库连接返回给所述数据库连接池,并释放所述ThreadLocal对象实现了释放资源,从而保证运行效率。
在图1所示的实施例中,通过将设定数量的数据库连接存储于数据库连接池,当监测到至少一个线程构建时,为构建的每一个所述线程创建对应的ThreadLocal对象;当所述线程接收到外部web应用发送的服务请求时,检测所述线程对应的ThreadLocal对象中是否存储有数据库连接,如果是,则直接获取所述ThreadLocal对象中存储的所述数据库连接;否则,将所述数据库连接池中存储的一个数据库连接转存到所述ThreadLocal对象;当监测到所述线程结束服务时,将所述线程对应的所述ThreadLocal对象存储的所述数据库连接,返回给所述数据库连接池,并释放所述ThreadLocal对象,由于被线程调用的数据库连接是进入到ThreadLocal对象进行存储,而一个线程对应一个ThreadLocal对象,数据库连接是经过一个中间静态变量ThreadLocal对象获得的,一般来说,一个数据库连接不会同时分配给多个ThreadLocal对象,这就保证分配给一个线程的数据库连接不会再分配给其他的线程,避免了多个处理线程同时通过相同的数据库连接处理数据库数据,从而降低了数据库中数据混乱的风险。
在本发明另一实施例中,为了避免多个ThreadLocal对象争夺同一个数据库连接,造成数据库连接池拥堵,上述方法进一步包括:为所述数据库连接池构建一个排队队列;在检测到所述线程对应的ThreadLocal对象中没有数据库连接之后,在将所述数据库连接池中存储的一个数据库连接转存到所述ThreadLocal对象之前,进一步包括:所述ThreadLocal对象进入所述排队队列;所述将所述数据库连接池中存储的一个数据库连接转存到所述ThreadLocal对象,包括:当所述排队队列中包含有至少两个ThreadLocal对象时,按照至少两个所述ThreadLocal对象进入所述排队队列的时间顺序,将所述数据库连接池中一个未被占用的数据库连接转存到所述ThreadLocal对象。通过排队队列对ThreadLocal对象按照进入排队队列的时间顺序进行排队,从而避免了多个ThreadLocal对象拥挤在数据库连接池入口。
在本发明一个实施例中,为了避免由于数据库连接池中的数据库连接被全部占用,而导致ThreadLocal对象等待过长时间,造成运行效率低下。在所述ThreadLocal对象进入所述排队队列之后,在所述将所述数据库连接池中一个未被占用的数据库连接转存到所述ThreadLocal对象之前,进一步包括:当一个目标ThreadLocal对象在所述排队队列中的排队时长达到排队时长阈值时,按照所述目标ThreadLocal对象在所述排队队列中的位置,计算增补数量;根据所述增补数量,为所述数据库连接池增补数据库连接;对所述排队队列中各个ThreadLocal对象的排队时长重新计时。
一般来说,数据库连接池设置有最小空闲连接数和最大连接数,数据库连接的总个数/设定数量不小于最小空闲连接数,且不大于最大连接数。例如:设置的最小空闲连接数位20,最大连接数为100,则数据库连接的总个数/设定数量需要不大于100,且不小于20。在本发明一个实施例中,为了避免无限制的为数据库连接池增加数据库连接而超出最大连接数,从而造成运行速率降低,所述按照所述目标ThreadLocal对象在所述排队队列中的位置,计算增补数量,包括:
当数据库连接的当前总个数等于预设的所述数据库连接池的最大连接数时,增补数量为0;
当数据库连接的当前总个数小于预设的所述数据库连接池的最大连接数时,根据下述计算公式组,计算增补数量;
其中,z表征增补数量,K表征预设的所述数据库连接池的最大连接数;v表征数据库连接的当前总个数;x表征所述排队队列中位于所述目标ThreadLocal对象之前的ThreadLocal对象的个数;y表征所述排队队列中位于所述目标ThreadLocal对象之后的ThreadLocal对象的个数;α表征用户设定的不小于0且不大于1的常数。
其中,数据库连接的当前总个数是指当前数据库连接池中未被分配给ThreadLocal对象的数据库连接的个数与分配给ThreadLocal对象的数据库连接的个数之和,也即当当前位于ThreadLocal对象内的数据库连接全部返回到数据库连接池后,数据库连接池中存储的数据库连接的总个数。
比如针对最大连接数为100来说,当一个ThreadLocal对象的排队时长达到排队时长阈值,检测到数据库连接的当前总个数为100,即等于最大连接数时,此时不能继续增加数据库连接池中数据库连接的个数,即增补数量为0,此时需要对排队等待的ThreadLocal对象的排队时长,进行重新计时。
比如检测到数据库连接的当前总个数为80即v=80,小于最大连接数100即K=100,在排队队列中,达到排队时长阈值的ThreadLocal对象之前的ThreadLocal对象个数为0,即x=0,达到排队时长阈值的ThreadLocal对象之后的ThreadLocal对象个数为20,即y=20,α设定为0.5,则满足那么,增补量为
又比如检测到数据库连接的当前总个数为80即v=80,小于最大连接数100即K=100,在排队队列中,达到排队时长阈值的ThreadLocal对象之前的ThreadLocal对象个数为10,即x=10,达到排队时长阈值的ThreadLocal对象之后的ThreadLocal对象个数为20,即y=20,α设定为0.5,则满足那么,增补量为z=K-v=100-80=20。
值得说明的是,α用户可以根据自己需要进行设定,但是α不小于0且不大于1。
在本发明一个实施例中,为了保证数据库连接池中数据库连接的个数始终处于比较合适的数量,避免数据库连接数量过多造成的资源浪费,同时避免数据库连接数量过少造成的资源拥挤,上述方法进一步包括:针对预设的至少两个统计周期中的每一个统计周期,执行:统计所述数据库连接池中剩余的数据库连接个数的最小值;利用统计出的每一个所述统计周期中所述数据库连接池中剩余的数据库连接个数的最小值,更新所述设定数量;当更新后的设定数量大于数据库连接的当前总个数时,为所述数据库连接池构建并存储(m-v)个新的数据库连接;当更新后的设定数量小于数据库连接的当前总个数时,为所述数据库连接池释放(v-m)个数据库连接,其中,m表征更新后的设定数量,v表征数据库连接的当前总个数。
其中,每一个统计周期可以根据用户自己设定,比如说一定的时间等。
值得说明的是,一个统计周期中,数据库连接池中剩余的数据库连接个数的最小值是指,在一个统计周期内,通过实时检测数据库连接池中剩余的数据库连接个数,并记录检测到的数据库连接池中每一个时刻剩余的数据库连接个数,其中最小值即为一个统计周期中,数据库连接池中剩余的数据库连接个数的最小值。
在本发明一个实施例中,所述利用统计出的每一个所述统计周期中所述数据库连接池中剩余的数据库连接个数的最小值,更新所述设定数量,包括:
利用下述设定数量计算公式组,计算新的设定数量,并利用计算出的新的设定数量更新原来的设定数量;
其中,k表征预设的所述数据库连接池的最小空闲连接数;T表征统计周期总个数;v表征数据库连接的当前总个数;si表征统计出的统计周期i中所述数据库连接池中剩余的数据库连接个数的最小值,i取值为1至T的正整数;K表征预设的所述数据库连接池的最大连接数;R表征更新后的设定数量。
在本发明一个实施例中,所述数据库连接池,包括:Durid数据库连接池。
为了能够清楚地说明获取数据库连接的方法,下面以Durid数据库连接池初始构建并存储数据库连接,然后在使用一段时间之后,根据使用情况对数据库连接的个数及设定数量进行调整的过程为例,展开说明,如图2所示,该方法可以包括以下步骤:
步骤201:为Durid数据库连接池构建一个排队队列,并将设定数量的数据库连接存储于Durid数据库连接池;
该Durid数据库连接池的构建方式可通过在构建的javaweb项目中加载Durid的jar包;
通过Durid数据库连接池构建数据库连接、数据库连接的初始设定数量以及数据库连接池的最小闲置连接数和最大连接数的过程可如下所示:
druidDataSource=new DruidDataSource();
druidDataSource.setDriverClassName("com.mysql.jdbc.Driver");
druidDataSource.setUsername(username);
druidDataSource.setPassword(password);
druidDataSource.setUrl(url);
druidDataSource.setInitialSize(20);
druidDataSource.setMinIdle(10);
druidDataSource.setMaxActive(100);
druidDataSource.setFilters("stat");
以上初始连接数为20,最小闲置连接数为10,最大连接数为100。
步骤202:当监测到至少一个线程构建时,为构建的每一个所述线程创建对应的ThreadLocal对象;
private static ThreadLocal<Connection>threadLocal=new ThreadLocal();
步骤203:当所述线程接收到外部web应用发送的服务请求时,检测所述线程对应的ThreadLocal对象中是否存储有数据库连接,如果是,则执行步骤204;否则,执行步骤205;
其中,数据库连接获取getCurrentConn()的一种实现方式:
步骤204:直接获取所述ThreadLocal对象中存储的所述数据库连接,并执行步骤212;
步骤205:所述ThreadLocal对象进入所述排队队列,当所述排队队列中仅有一个ThreadLocal对象时,执行步骤206;当所述排队队列中包含有至少两个ThreadLocal对象时,执行步骤207;
步骤206:直接将所述Durid数据库连接池中存储的一个数据库连接转存到所述ThreadLocal对象,并获取所述ThreadLocal对象中存储的所述数据库连接,执行步骤212;
步骤207:按照至少两个所述ThreadLocal对象进入所述排队队列的时间顺序,将所述Durid数据库连接池中一个未被占用的数据库连接转存到所述ThreadLocal对象,分别执行步骤208和步骤212;
步骤208:当一个目标ThreadLocal对象在所述排队队列中的排队时长达到排队时长阈值时,按照所述目标ThreadLocal对象在所述排队队列中的位置,计算增补数量;
该步骤的具体实施方式:
当数据库连接的当前总个数等于预设的所述Durid数据库连接池的最大连接数时,增补数量为0;
当数据库连接的当前总个数小于预设的所述Durid数据库连接池的最大连接数时,根据下述计算公式组,计算增补数量;
其中,z表征增补数量,K表征预设的所述数据库连接池的最大连接数;v表征数据库连接的当前总个数;x表征所述排队队列中位于所述目标ThreadLocal对象之前的ThreadLocal对象的个数;y表征所述排队队列中位于所述目标ThreadLocal对象之后的ThreadLocal对象的个数;α表征用户设定的不小于0且不大于1的常数。
比如检测到数据库连接的当前总个数为80即v=80,小于最大连接数100即K=100,在排队队列中,达到排队时长阈值的ThreadLocal对象之前的ThreadLocal对象个数为0,即x=0,达到排队时长阈值的ThreadLocal对象之后的ThreadLocal对象个数为20,即y=20,α设定为0.5,则满足那么,增补量为
又比如检测到数据库连接的当前总个数为80即v=80,小于最大连接数100即K=100,在排队队列中,达到排队时长阈值的ThreadLocal对象之前的ThreadLocal对象个数为10,即x=10,达到排队时长阈值的ThreadLocal对象之后的ThreadLocal对象个数为20,即y=20,α设定为0.5,则满足那么,增补量为z=K-v=100-80=20。
步骤209:根据所述增补数量,为所述Durid数据库连接池增补数据库连接;
步骤210:对所述排队队列中各个ThreadLocal对象的排队时长重新计时;
步骤208至步骤210主要是避免ThreadLocal对象在排队队列中等待太久的时间,通过增补数据库连接,保证数据库连接获取效率。
步骤211:分配增补后的数据库连接给排队队列中的ThreadLocal对象
步骤212:当监测到所述线程结束服务时,将所述线程对应的所述ThreadLocal对象存储的所述数据库连接,返回给所述数据库连接池,并释放所述ThreadLocal对象;
该步骤主要是针对ThreadLocal对象存储有数据库连接来说,可以理解地,对于空的ThreadLocal对象来说,当监测到所述线程结束服务时,直接释放该ThreadLocal对象。该步骤实现了释放无用的资源,从而减少对资源不必要的占用。
步骤213:针对预设的至少两个统计周期中的每一个统计周期,执行:统计所述数据库连接池中剩余的数据库连接个数的最小值;
步骤214:利用统计出的每一个所述统计周期中所述数据库连接池中剩余的数据库连接个数的最小值,更新所述设定数量;当更新后的设定数量大于数据库连接的当前总个数时,执行215;当更新后的设定数量小于数据库连接的当前总个数时,执行216;
利用下述设定数量计算公式组,计算新的设定数量,并利用计算出的新的设定数量更新原来的设定数量;
其中,k表征预设的所述数据库连接池的最小空闲连接数;T表征统计周期总个数;v表征数据库连接的当前总个数;si表征统计出的统计周期i中所述数据库连接池中剩余的数据库连接个数的最小值,i取值为1至T的正整数;K表征预设的所述数据库连接池的最大连接数;R表征更新后的设定数量。
步骤215:为所述数据库连接池构建并存储(m-v)个新的数据库连接,其中,m表征更新后的设定数量,v表征数据库连接的当前总个数,并结束当前流程;
步骤216:为所述数据库连接池释放(v-m)个数据库连接,其中,m表征更新后的设定数量,v表征数据库连接的当前总个数。
值得说明的是,步骤213至步骤216为调整设置数量的过程,其可在上述步骤202至步骤212之间任意一个步骤之前或之后执行,本发明实施例仅给出了在步骤212之后的形式,该调整设置数量的过程并不会影响上述的步骤的数据库连接获取过程。
如图3、图4所示,本发明实施例提供了一种获取数据库连接的装置。装置实施例可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。从硬件层面而言,如图3所示,为本发明实施例提供的获取数据库连接的装置所在设备的一种硬件结构图,除了图3所示的处理器、内存、网络接口、以及非易失性存储器之外,实施例中装置所在的设备通常还可以包括其他硬件,如负责处理报文的转发芯片等等。以软件实现为例,如图4所示,作为一个逻辑意义上的装置,是通过其所在设备的CPU将非易失性存储器中对应的计算机程序指令读取到内存中运行形成的。本实施例提供的获取数据库连接的装置,包括:连接构建单元401、数据库连接池402、访问处理单元403和释放单元404,其中,
所述连接构建单元401,用于构建设定数量的数据库连接;
所述数据库连接池402,用于存储所述连接构建单元401构建的所述数据库连接;
所述访问处理单元403,用于当监测到至少一个线程构建时,为构建的每一个所述线程创建对应的ThreadLocal对象,当所述线程接收到外部web应用发送的服务请求时,检测所述线程对应的ThreadLocal对象中是否存储有数据库连接,如果是,则直接获取所述ThreadLocal对象中存储的所述数据库连接;否则,将所述数据库连接池402中存储的一个数据库连接转存到所述ThreadLocal对象;
所述释放单元404,用于当监测到所述线程结束服务时,将所述线程对应的所述ThreadLocal对象存储的所述数据库连接,返回给所述数据库连接池402,并释放所述ThreadLocal对象。
如图5所示,在本发明另一实施例中,上述装置进一步包括:增补数量计算单元501,其中,
所述访问处理单元403,进一步用于:在检测到所述线程对应的ThreadLocal对象中没有数据库连接之后,控制所述ThreadLocal对象进入预先构建的排队队列;当所述排队队列中包含有至少两个ThreadLocal对象时,按照至少两个所述ThreadLocal对象进入所述排队队列的时间顺序,将所述数据库连接池中一个未被占用的数据库连接转存到所述ThreadLocal对象;当一个目标ThreadLocal对象在所述排队队列中的排队时长达到排队时长阈值时,触发所述增补数量计算单元501,并对所述排队队列中各个ThreadLocal对象的排队时长重新计时;
所述增补数量计算单元501,用于当数据库连接的当前总个数等于预设的所述数据库连接池的最大连接数时,增补数量为0;当数据库连接的当前总个数小于预设的所述数据库连接池的最大连接数时,根据下述计算公式组,计算增补数量;
其中,z表征增补数量,K表征预设的所述数据库连接池的最大连接数;v表征数据库连接的当前总个数;x表征所述排队队列中位于所述目标ThreadLocal对象之前的ThreadLocal对象的个数;y表征所述排队队列中位于所述目标ThreadLocal对象之后的ThreadLocal对象的个数;α表征用户设定的不小于0且不大于1的常数;
所述连接构建单元401,进一步用于根据所述增补数量计算单元501计算出的增补数量,为所述数据库连接池402增补数据库连接。
在本发明又一实施例中,上述装置进一步包括:更新单元(图中未示出),其中,
所述更新单元,用于针对预设的至少两个统计周期中的每一个统计周期,执行:统计所述数据库连接池中剩余的数据库连接个数的最小值;利用统计出的每一个所述统计周期中所述数据库连接池中剩余的数据库连接个数的最小值,更新所述设定数量,当所述更新单元更新后的设定数量大于数据库连接的当前总个数时,触发所述连接构建单元401,当更新后的设定数量小于数据库连接的当前总个数时,触发所述数据库连接池402;
所述连接构建单元401,进一步用于当接收到所述更新单元触发时,构建(m-v)个新的数据库连接,并将构建的(m-v)个新的数据库连接存储到所述数据库连接池;
所述数据库连接池402,进一步用于当接收到所述更新单元触发时,释放(v-m)个数据库连接;
其中,m表征更新后的设定数量,v表征数据库连接的当前总个数。
在本发明另一实施例中,所述更新单元,用于利用下述设定数量计算公式组,计算新的设定数量,并利用计算出的新的设定数量更新原来的设定数量;
其中,k表征预设的所述数据库连接池的最小空闲连接数;T表征统计周期总个数;v表征数据库连接的当前总个数;si表征统计出的统计周期i中所述数据库连接池中剩余的数据库连接个数的最小值,i取值为1至T的正整数;K表征预设的所述数据库连接池的最大连接数;R表征更新后的设定数量。
在本发明另一实施例中,所述数据库连接池,包括:Durid数据库连接池。
上述装置内的各单元之间的信息交互、执行过程等内容,由于与本发明方法实施例基于同一构思,具体内容可参见本发明方法实施例中的叙述,此处不再赘述。
本发明实施例提供了一种可读介质,包括执行指令,当存储控制器的处理器执行所述执行指令时,所述存储控制器执行本发明上述任一实施例提供的方法。
本发明实施例提供了一种存储控制器,包括:处理器、存储器和总线;所述存储器用于存储执行指令,所述处理器与所述存储器通过所述总线连接,当所述存储控制器运行时,所述处理器执行所述存储器存储的所述执行指令,以使所述存储控制器执行本发明上述任一实施例提供的方法。
综上所述,本发明以上各个实施例至少具有如下有益效果:
1、在本发明实施例中,通过将设定数量的数据库连接存储于数据库连接池,当监测到至少一个线程构建时,为构建的每一个所述线程创建对应的ThreadLocal对象;当所述线程接收到外部web应用发送的服务请求时,检测所述线程对应的ThreadLocal对象中是否存储有数据库连接,如果是,则直接获取所述ThreadLocal对象中存储的所述数据库连接;否则,将所述数据库连接池中存储的一个数据库连接转存到所述ThreadLocal对象;当监测到所述线程结束服务时,将所述线程对应的所述ThreadLocal对象存储的所述数据库连接,返回给所述数据库连接池,并释放所述ThreadLocal对象,由于被线程调用的数据库连接是进入到ThreadLocal对象进行存储,而一个线程对应一个ThreadLocal对象,这就保证分配给一个线程的数据库连接不会再分配给其他的线程,避免了多个处理线程同时通过相同的数据库连接处理数据库数据,从而降低了数据库中数据混乱的风险。
2、在本发明实施例中,通过为所述数据库连接池构建一个排队队列;在检测到所述线程对应的ThreadLocal对象中没有数据库连接之后,ThreadLocal对象进入所述排队队列;当所述排队队列中包含有至少两个ThreadLocal对象时,按照至少两个所述ThreadLocal对象进入所述排队队列的时间顺序,将所述数据库连接池中一个未被占用的数据库连接转存到所述ThreadLocal对象。通过排队队列对ThreadLocal对象按照进入排队队列的时间顺序进行排队,从而避免了多个ThreadLocal对象拥挤在数据库连接池入口。
3、在本发明实施例中,当一个目标ThreadLocal对象在所述排队队列中的排队时长达到排队时长阈值时,按照所述目标ThreadLocal对象在所述排队队列中的位置,计算增补数量;根据所述增补数量,为所述数据库连接池增补数据库连接;对所述排队队列中各个ThreadLocal对象的排队时长重新计时,避免ThreadLocal对象等待过长时间,造成运行效率低下。
4、在本发明实施例中,针对预设的至少两个统计周期中的每一个统计周期,执行:统计所述数据库连接池中剩余的数据库连接个数的最小值;利用统计出的每一个所述统计周期中所述数据库连接池中剩余的数据库连接个数的最小值,更新所述设定数量;当更新后的设定数量大于数据库连接的当前总个数时,为所述数据库连接池构建并存储(m-v)个新的数据库连接;当更新后的设定数量小于数据库连接的当前总个数时,为所述数据库连接池释放(v-m)个数据库连接,其中,m表征更新后的设定数量,v表征数据库连接的当前总个数,保证了数据库连接池中数据库连接的个数始终处于比较合适的数量,避免数据库连接数量过多造成的资源浪费,同时避免数据库连接数量过少造成的资源拥挤。
5、本发明实施例提供的方案能让每个线程使用的数据库连接是确定的,避免多个线程同时使用同一个连接的错误,同时,通过按需增加或者释放数据库连接,提高了整个连接池的使用效率,从而进一步地提高整个数据库服务的服务能力阈值。
需要说明的是,在本文中,诸如第一和第二之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个······”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同因素。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储在计算机可读取的存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质中。
最后需要说明的是:以上所述仅为本发明的较佳实施例,仅用于说明本发明的技术方案,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所做的任何修改、等同替换、改进等,均包含在本发明的保护范围内。
Claims (8)
1.一种获取数据库连接的方法,其特征在于,将设定数量的数据库连接存储于数据库连接池,还包括:
当监测到至少一个线程构建时,为构建的每一个所述线程创建对应的ThreadLocal对象;
当所述线程接收到外部web应用发送的服务请求时,检测所述线程对应的ThreadLocal对象中是否存储有数据库连接,如果是,则直接获取所述ThreadLocal对象中存储的所述数据库连接;否则,将所述数据库连接池中存储的一个数据库连接转存到所述ThreadLocal对象;
当监测到所述线程结束服务时,将所述线程对应的所述ThreadLocal对象存储的所述数据库连接,返回给所述数据库连接池,并释放所述ThreadLocal对象;
进一步包括:为所述数据库连接池构建一个排队队列;
在检测到所述线程对应的ThreadLocal对象中没有数据库连接之后,在将所述数据库连接池中存储的一个数据库连接转存到所述ThreadLocal对象之前,进一步包括:
所述ThreadLocal对象进入所述排队队列;
所述将所述数据库连接池中存储的一个数据库连接转存到所述ThreadLocal对象,包括:
当所述排队队列中包含有至少两个ThreadLocal对象时,按照至少两个所述ThreadLocal对象进入所述排队队列的时间顺序,将所述数据库连接池中一个未被占用的数据库连接转存到所述ThreadLocal对象;
在所述ThreadLocal对象进入所述排队队列之后,在所述将所述数据库连接池中一个未被占用的数据库连接转存到所述ThreadLocal对象之前,进一步包括:
当一个目标ThreadLocal对象在所述排队队列中的排队时长达到排队时长阈值时,
按照所述目标ThreadLocal对象在所述排队队列中的位置,计算增补数量;
根据所述增补数量,为所述数据库连接池增补数据库连接;
对所述排队队列中各个ThreadLocal对象的排队时长重新计时。
2.根据权利要求1所述的方法,其特征在于,所述按照所述目标ThreadLocal对象在所述排队队列中的位置,计算增补数量,包括:
当数据库连接的当前总个数等于预设的所述数据库连接池的最大连接数时,增补数量为0;
当数据库连接的当前总个数小于预设的所述数据库连接池的最大连接数时,根据下述计算公式组,计算增补数量;
其中,z表征增补数量,K表征预设的所述数据库连接池的最大连接数;v表征数据库连接的当前总个数;x表征所述排队队列中位于所述目标ThreadLocal对象之前的ThreadLocal对象的个数;y表征所述排队队列中位于所述目标ThreadLocal对象之后的ThreadLocal对象的个数;α表征用户设定的不小于0且不大于1的常数。
3.根据权利要求1或2所述的方法,其特征在于,进一步包括:
针对预设的至少两个统计周期中的每一个统计周期,执行:统计所述数据库连接池中剩余的数据库连接个数的最小值;
利用统计出的每一个所述统计周期中所述数据库连接池中剩余的数据库连接个数的最小值,更新所述设定数量;
当更新后的设定数量大于数据库连接的当前总个数时,为所述数据库连接池构建并存储(m-v)个新的数据库连接;
当更新后的设定数量小于数据库连接的当前总个数时,为所述数据库连接池释放(v-m)个数据库连接,其中,m表征更新后的设定数量,v表征数据库连接的当前总个数。
5.一种获取数据库连接的装置,其特征在于,包括:连接构建单元、数据库连接池、访问处理单元和释放单元,其中,
所述连接构建单元,用于构建设定数量的数据库连接;
所述数据库连接池,用于存储所述连接构建单元构建的所述数据库连接;
所述访问处理单元,用于当监测到至少一个线程构建时,为构建的每一个所述线程创建对应的ThreadLocal对象,当所述线程接收到外部web应用发送的服务请求时,检测所述线程对应的ThreadLocal对象中是否存储有数据库连接,如果是,则直接获取所述ThreadLocal对象中存储的所述数据库连接;否则,将所述数据库连接池中存储的一个数据库连接转存到所述ThreadLocal对象;
所述释放单元,用于当监测到所述线程结束服务时,将所述线程对应的所述ThreadLocal对象存储的所述数据库连接,返回给所述数据库连接池,并释放所述ThreadLocal对象;
进一步包括:增补数量计算单元,其中,
所述访问处理单元,进一步用于:在检测到所述线程对应的ThreadLocal对象中没有数据库连接之后,控制所述ThreadLocal对象进入预先构建的排队队列;当所述排队队列中包含有至少两个ThreadLocal对象时,按照至少两个所述ThreadLocal对象进入所述排队队列的时间顺序,将所述数据库连接池中一个未被占用的数据库连接转存到所述ThreadLocal对象;当一个目标ThreadLocal对象在所述排队队列中的排队时长达到排队时长阈值时,触发所述增补数量计算单元计算增补数量,并对所述排队队列中各个ThreadLocal对象的排队时长重新计时;
所述连接构建单元,进一步用于根据所述增补数量计算单元计算出的增补数量,为所述数据库连接池增补数据库连接。
7.根据权利要求5或6所述的装置,其特征在于,进一步包括:更新单元,其中,
所述更新单元,用于针对预设的至少两个统计周期中的每一个统计周期,执行:统计所述数据库连接池中剩余的数据库连接个数的最小值;利用统计出的每一个所述统计周期中所述数据库连接池中剩余的数据库连接个数的最小值,更新所述设定数量,当所述更新单元更新后的设定数量大于数据库连接的当前总个数时,触发所述连接构建单元,当更新后的设定数量小于数据库连接的当前总个数时,触发所述数据库连接池;
所述连接构建单元,进一步用于当接收到所述更新单元触发时,构建(m-v)个新的数据库连接,并将构建的(m-v)个新的数据库连接存储到所述数据库连接池;
所述数据库连接池,进一步用于当接收到所述更新单元触发时,释放(v-m)个数据库连接;
其中,m表征更新后的设定数量,v表征数据库连接的当前总个数。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810925115.XA CN109284311B (zh) | 2018-08-14 | 2018-08-14 | 一种获取数据库连接的方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810925115.XA CN109284311B (zh) | 2018-08-14 | 2018-08-14 | 一种获取数据库连接的方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109284311A CN109284311A (zh) | 2019-01-29 |
CN109284311B true CN109284311B (zh) | 2020-10-23 |
Family
ID=65183080
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810925115.XA Active CN109284311B (zh) | 2018-08-14 | 2018-08-14 | 一种获取数据库连接的方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109284311B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110012075B (zh) * | 2019-03-12 | 2022-02-18 | 平安科技(深圳)有限公司 | 数据传输方法及相关设备 |
CN111586140A (zh) * | 2020-04-30 | 2020-08-25 | 深圳市优必选科技股份有限公司 | 一种数据交互的方法及服务器 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103365929A (zh) * | 2012-04-10 | 2013-10-23 | 阿里巴巴集团控股有限公司 | 一种数据库连接的管理方法及系统 |
CN104239365A (zh) * | 2013-06-24 | 2014-12-24 | 北京新媒传信科技有限公司 | 一种获取数据库连接池中连接的方法和数据库连接池 |
CN105138693A (zh) * | 2015-09-18 | 2015-12-09 | 联动优势科技有限公司 | 一种访问数据库的方法及装置 |
CN105302692A (zh) * | 2015-10-28 | 2016-02-03 | 联动优势科技有限公司 | 基于内外参数的数据库连接池监控和管理的方法和装置 |
CN105426285A (zh) * | 2015-10-28 | 2016-03-23 | 联动优势科技有限公司 | 数据库连接池监控和管理的方法和装置 |
CN105701163A (zh) * | 2015-12-31 | 2016-06-22 | 山东中创软件工程股份有限公司 | 基于ThreadLocal连接容器的数据库连接获取方法和装置 |
CN106250500A (zh) * | 2016-07-29 | 2016-12-21 | 广州唯品会信息科技有限公司 | 数据库连接池的动态管理方法和系统 |
-
2018
- 2018-08-14 CN CN201810925115.XA patent/CN109284311B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103365929A (zh) * | 2012-04-10 | 2013-10-23 | 阿里巴巴集团控股有限公司 | 一种数据库连接的管理方法及系统 |
CN104239365A (zh) * | 2013-06-24 | 2014-12-24 | 北京新媒传信科技有限公司 | 一种获取数据库连接池中连接的方法和数据库连接池 |
CN105138693A (zh) * | 2015-09-18 | 2015-12-09 | 联动优势科技有限公司 | 一种访问数据库的方法及装置 |
CN105302692A (zh) * | 2015-10-28 | 2016-02-03 | 联动优势科技有限公司 | 基于内外参数的数据库连接池监控和管理的方法和装置 |
CN105426285A (zh) * | 2015-10-28 | 2016-03-23 | 联动优势科技有限公司 | 数据库连接池监控和管理的方法和装置 |
CN105701163A (zh) * | 2015-12-31 | 2016-06-22 | 山东中创软件工程股份有限公司 | 基于ThreadLocal连接容器的数据库连接获取方法和装置 |
CN106250500A (zh) * | 2016-07-29 | 2016-12-21 | 广州唯品会信息科技有限公司 | 数据库连接池的动态管理方法和系统 |
Non-Patent Citations (2)
Title |
---|
java jdbc深入理解(connection与threadlocal与数据库连接池和事务实);THISISPAN;《https://www.cnblogs.com/panxuejun/p/5920845.html》;20170804;第1-13页 * |
THISISPAN.java jdbc深入理解(connection与threadlocal与数据库连接池和事务实).《https://www.cnblogs.com/panxuejun/p/5920845.html》.2017,1-13. * |
Also Published As
Publication number | Publication date |
---|---|
CN109284311A (zh) | 2019-01-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP3796150B1 (en) | Storage volume creation method and apparatus, server, and storage medium | |
CN107579926B (zh) | 基于令牌桶算法的Ceph云存储系统的QoS设置方法 | |
JP4294879B2 (ja) | サービスレベル制御機構を有するトランザクション処理システム及びそのためのプログラム | |
US10884667B2 (en) | Storage controller and IO request processing method | |
CN107451853B (zh) | 一种红包实时派发的方法、装置、系统及存储介质 | |
CN112866136B (zh) | 业务数据处理方法和装置 | |
US11018965B1 (en) | Serverless function scaling | |
CN111901249A (zh) | 业务限流方法、装置、设备及存储介质 | |
CN108574645B (zh) | 一种队列调度方法及装置 | |
CN109284311B (zh) | 一种获取数据库连接的方法和装置 | |
EP2962200B1 (en) | System and method for using a sequencer in a concurrent priority queue | |
US11044209B2 (en) | Asymmetric co-operative queue management for messages | |
CN108681481A (zh) | 业务请求的处理方法及装置 | |
CN111857992B (zh) | 一种Radosgw模块中线程资源分配方法和装置 | |
CN114598658A (zh) | 一种流量限制方法及装置 | |
KR101915944B1 (ko) | 클러스터 시스템에서의 클라이언트 요청 처리 방법, 상기 클라이언트 요청에 따른 입출력 처리 방법 및 장치 | |
CN110362426A (zh) | 一种面向突发性负载的选择性副本实现方法及系统 | |
WO2024051485A1 (en) | Methods and systems for request traffic management | |
EP2951691B1 (en) | System and method for supporting work sharing muxing in a cluster | |
CN111831408A (zh) | 异步任务处理方法、装置、电子设备及介质 | |
CN111736975A (zh) | 请求控制方法、装置、计算机设备及计算机可读存储介质 | |
CN114785739A (zh) | 逻辑卷服务质量的控制方法、装置、设备及介质 | |
CN114844838A (zh) | 一种流量控制方法和装置 | |
CN113886082A (zh) | 请求处理方法、装置、计算设备及介质 | |
CN108521352B (zh) | 基于随机回报网的在线云服务尾延迟预测方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |