APP下载

详解数据库连线池概念、原理、执行机制等

消息来源:baojiabao.com 作者: 发布时间:2026-05-21

报价宝综合消息详解数据库连线池概念、原理、执行机制等

概述

数据库连线池是负责分配、管理和释放数据库连线,它允许应用程序重复使用一个现有的数据库连线,而不是再重新建立一个。那么其中的执行机制又是怎样的呢?今天主要介绍一下数据库连线池原理和常用的连线池。

01

为什么要使用连线池

数据库连线是一种关键的有限的昂贵的资源,这一点在多使用者的网页应用程序中体现得尤为突出。 一个数据库连线物件均对应一个物理数据库连线,每次操作都开启一个物理连线,使用完都关闭连线,这样造成系统的效能低下。

数据库连线池的解决方案是在应用程序启动时建立足够的数据库连线,并讲这些连线组成一个连线池(简单说:在一个“池”里放了好多半成品的数据库连线物件),由应用程序动态地对池中的连线进行申请、使用和释放。对于多于连线池中连线数的并发请求,应该在请求伫列中排队等待。并且应用程序可以根据池中连线的使用率,动态增加或减少池中的连线数。

连线池技术尽可能多地重用了消耗内存地资源,大大节省了内存,提高了服务器地服务效率,能够支援更多的客户服务。通过使用连线池,将大大提高程式执行效率,同时,我们可以通过其自身的管理机制来监视数据库连线的数量、使用情况等。

02

传统的连线机制与数据库连线池执行机制区别

1、不使用连线池流程

下面以访问MySQL为例,执行一个SQL命令,如果不使用连线池,需要经过哪些流程。

不使用数据库连线池的步骤:

TCP建立连线的三次握手MySQL认证的三次握手真正的SQL执行MySQL的关闭TCP的四次握手关闭可以看到,为了执行一条SQL,却多了非常多网络互动。

优点:

实现简单缺点:

网络IO较多数据库的负载较高响应时间较长及QPS较低应用频繁的建立连线和关闭连线,导致临时物件较多,GC频繁在关闭连线后,会出现大量TIME_WAIT 的TCP状态(在2个MSL之后关闭)2、使用连线池流程

使用数据库连线池的步骤:

第一次访问的时候,需要建立连线。 但是之后的访问,均会复用之前建立的连线,直接执行SQL语句。

优点:

较少了网络开销系统的效能会有一个实质的提升没了麻烦的TIME_WAIT状态

03

数据库连线池的工作原理

连线池的工作原理主要由三部分组成,分别为

连线池的建立连线池中连线的使用管理连线池的关闭第一、连线池的建立。

一般在系统初始化时,连线池会根据系统配置建立,并在池中建立了几个连线物件,以便使用时能从连线池中获取。连线池中的连线不能随意建立和关闭,这样避免了连线随意建立和关闭造成的系统开销。

Java中提供了很多容器类可以方便的构建连线池,例如Vector、Stack等。

第二、连线池的管理。

连线池管理策略是连线池机制的核心,连线池内连线的分配和释放对系统的效能有很大的影响。其管理策略是:

当客户请求数据库连线时,首先检视连线池中是否有空闲连线,如果存在空闲连线,则将连线分配给客户使用;如果没有空闲连线,则检视当前所开的连线数是否已经达到最大连线数,如果没达到就重新建立一个连线给请求的客户;如果达到就按设定的最大等待时间进行等待,如果超出最大等待时间,则丢掷异常给客户。

当客户释放数据库连线时,先判断该连线的引用次数是否超过了规定值,如果超过就从连线池中删除该连线,否则保留为其他客户服务。

该策略保证了数据库连线的有效复用,避免频繁的建立、释放连线所带来的系统资源开销。

第三、连线池的关闭。

当应用程序退出时,关闭连线池中所有的连线,释放连线池相关的资源,该过程正好与建立相反。

04

连线池需要注意的点

1、并发问题

为了使连线管理服务具有最大的通用性,必须考虑多执行绪环境,即并发问题。

这个问题相对比较好解决,因为各个语言自身提供了对并发管理的支援像java,c#等等,使用synchronized(java)lock(C#)关键字即可确保执行绪是同步的。

2、事务处理

我们知道,事务具有原子性,此时要求对数据库的操作符合“ALL-OR-NOTHING”原则,即对于一组SQL语句要么全做,要么全不做。

我们知道当2个执行绪共用一个连线Connection物件,而且各自都有自己的事务要处理时候,对于连线池是一个很头疼的问题,因为即使Connection类提供了相应的事务支援,可是我们仍然不能确定那个数据库操作是对应那个事务的,这是由于我们有2个执行绪都在进行事务操作而引起的。

为此我们可以使用每一个事务独占一个连线来实现,虽然这种方法有点浪费连线池资源但是可以大大降低事务管理的复杂性。

3、连线池的分配与释放

连线池的分配与释放,对系统的效能有很大的影响。合理的分配与释放,可以提高连线的复用度,从而降低建立新连线的开销,同时还可以加快使用者的访问速度。

对于连线的管理可使用一个List。即把已经建立的连线都放入List中去统一管理。每当使用者请求一个连线时,系统检查这个List中有没有可以分配的连线。如果有就把那个最合适的连线分配给他,如果没有就丢掷一个异常给使用者。

4、连线池的配置与维护

连线池中到底应该放置多少连线,才能使系统的效能最佳?

系统可采取设定最小连线数(minConnection)和最大连线数(maxConnection)等引数来控制连线池中的连线。比方说,最小连线数是系统启动时连线池所建立的连线数。如果建立过多,则系统启动就慢,但建立后系统的响应速度会很快;如果建立过少,则系统启动的很快,响应起来却慢。这样,可以在开发时,设定较小的最小连线数,开发起来会快,而在系统实际使用时设定较大的,因为这样对访问客户来说速度会快些。最大连线数是连线池中允许连线的最大数目,具体设定多少,要看系统的访问量,可通过软件需求上得到。

如何确保连线池中的最小连线数呢?有动态和静态两种策略。动态即每隔一定时间就对连线池进行检测,如果发现连线数量小于最小连线数,则补充相应数量的新连线,以保证连线池的正常运转。静态是发现空闲连线不够时再去检查。

总结

时至今日,虽然每个应用(需要RDBMS的)都离不开连线池,但在实际使用的时候,连线池已经可以做到“隐形”了。也就是说在通常情况下,连线池完成专案初始化配置之后,就再不需要再做任何改动了。

后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~

2019-12-24 20:52:00

相关文章