(面试经典问题之连接池篇)连接池构成、作用及其基本原理详解

一、什么是连接池

连接池一般指的是数据库连接池(connection pooling),是指程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态的对池中的连接进行申请,使用,释放(跟前面文章提到线程池、内存池的概念很像,因为他们都是属于池式结构)。

二、为什么需要数据库连接池

维持管理固定数量的连接,复用连接资源(只要是池式结构,其主要功能就是复用资源):

1、维持与数据库的TCP连接(长连接,而非短连接)(ps:本文的数据库均已MySQL举例);

2、复用连接资源,可复用同一条连接多次执行sql语句,避免了频繁建立和断开tcp连接所需要的资源和时间开销(三次握手建立TCP连接,四次挥手断开TCP连接,读者可以自行回顾一下,看看是否还记得);

3、统一的连接管理,避免数据库连接泄漏;

三、连接池的运行机理

连接池又分为同步连接池和异步连接池,以下将分开进行原理讲解:

同步连接池:

结构如图所示:

工作流程为:用户线程从线程池中获取可用连接(即未被锁定的连接),并同步等待连接的返回(即阻塞当前线程或者当前协程等待返回)。

连接池中的连接数量表示当前最多允许几个用户线程或协程并发使用连接。

应用:服务端启动时,初始化资源需要使用同步连接池。

异步连接池:

结构如图所示:连接池中的连接和线程池中的线程一一对应(即一个线程分配一个连接,是线程池和连接池的共同作用下形成了异步连接池)

工作流程为:用户线程发布任务并将其push进执行任务队列,异步连接池中的线程从队列中取出任务进行消费,消费完成后通过异步回调来通知用户线程获取返回结果。

连接池中的连接数量表示当前允许几个连接同时执行sql语句。(与同步连接池不同,连接数量不代表最多允许几个用户线程或协程并发使用连接,可以是无穷多个用户同时往任务队列里push任务)

应用:服务器启动后的业务处理,一些高并发的业务场景。

四、一些学习中产生的问题及思考

同步连接池性能高还是异步性能高?

按照经验而言,异步往往是性能更高的一方,当然,这个问题中答案也是如此。但是,回答这个问题我们首先要明确主语,即这个性能指的是连接池的性能还是用户线程的性能,性能的直观体现是什么?在此处,性能我们一般默认指用户线程的性能,性能的直观表现就是我用户线程需不需要阻塞等待耗时任务完成,显然,同步连接池就是阻塞线程等待的底层逻辑,而异步线程池则是push任务后直接返回,因此异步的性能更高。

为什么服务端启动时,初始化资源需要使用同步连接池?

上面讲到异步性能更高,但为什么该场景下需要使用同步连接池?原因在于:同步的方案,只有等到任务完成才返回,因此对于用户线程而言,可以明确的知道我的初始化工作是否全部完成,但是异步的方案什么时候返回结果是未知的,而初始化需要确保所有资源、任务都完成,固选用同步连接池。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/23167.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java+SpringBoot+Vue+数据可视化的综合健身管理平台(程序+论文+讲解+安装+调试+售后)

感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统介绍 在当今社会,随着人们生活水平的不断提高和健康意识的日益增强,健…

echarts找不到了?echarts社区最新地址

前言:在之前使用echarts的时候,还可以通过上边的导航栏找到echarts社区,但是如今的echarts变更之后,就找不到echarts社区了。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 如今…

Jenkins 配置 Credentials 凭证

Jenkins 配置 Credentials 凭证 一、创建凭证 Dashboard -> Manage Jenkins -> Manage Credentials 在 Domain 列随便点击一个 (global) 二、添加 凭证 点击左侧 Add Credentials 四、填写凭证 Kind:凭证类型 Username with password: 配置 用…

【Nacos】从零开始启动Nacos服务(windows/linux)

文章目录 前言前置条件官方网址一、Nacos下载1.1 选择Nacos版本1.2 下载 二、解压2.1 解压到某个文件夹 三、 启动3.1 方式一:直接使用命令启动3.1.1 进入bin文件夹3.1.2 进入命令行工具3.1.3 执行命令 3.2 方式二:修改配置文件后启动3.2.1 修改启动脚本…

Microsoft 365 Copilot中使用人数最多的是哪些应用

今天在浏览Microsoft 365 admin center时发现,copilot会自动整理过去30天内所有用户使用copilot的概况: 直接把这个图丢给copilot让它去分析,结果如下: 总用户情况 总用户数在各应用中均为 561 人,说明此次统计的样本…

AI学习第一天-什么是AI

AI的发展可以被分为四次浪潮,这包括符号主义、机器学习与神经网络,以及深度学习。在这些发展中,深度学习凭借其在处理非结构化复杂数据、强大的学习能力和可解释性方面的优势备受关注。深度学习技术的应用不仅提升了AI系统的性能,…

计算机视觉:经典数据格式(VOC、YOLO、COCO)解析与转换(附代码)

第一章:计算机视觉中图像的基础认知 第二章:计算机视觉:卷积神经网络(CNN)基本概念(一) 第三章:计算机视觉:卷积神经网络(CNN)基本概念(二) 第四章:搭建一个经典的LeNet5神经网络(附代码) 第五章&#xff1…

解决本地模拟IP的DHCP冲突问题

解决 DHCP 冲突导致的多 IP 绑定失效问题 前言 续接上一篇在本机上模拟IP地址。 在实际操作中,如果本机原有 IP(如 192.168.2.7)是通过 DHCP 自动获取的,直接添加新 IP(如 10.0.11.11)可能会导致 DHCP 服…

安全生产月安全知识竞赛主持稿串词

女:尊敬的各位领导、各位来宾 男:各位参赛选手、观众朋友们 合:大家好~ 女:安全是天,有了这一份天,我们的员工就会多一份幸福, 我们的企业就会多一丝光彩。 男:安全是地,有了这一片地,我们的员工就多了一…

JDBC学习

背景:主机正在运行mysql服务 在cmd输入 mysql -u root -p 之后,输入密码(我的用户名是root,密码是root),成功登录到mysql。 输入:SHOW GLOBAL VARIABLES LIKE port; 检查mysql服务的端口号 …

前端js进阶,ES6语法,包详细

进阶ES6 作用域的概念加深对js理解 let、const申明的变量,在花括号中会生成块作用域,而var就不会生成块作用域 作用域链本质上就是底层的变量查找机制 作用域链查找的规则是:优先查找当前作用域先把的变量,再依次逐级找父级作用域直到全局…

IDEA通过Maven使用JBLJavaToWeb插件创建Web项目

第一步:IDEA下载JBLJavaToWeb插件 File--->Settings--->Plugins--->Marketplace搜索: JBLJavaToWeb 第二步:创建普通Maven工程 第三步: 将普通Maven项目转换为Web项目

在VSCode中接入deepseek

注册就送14元2000万tokens。 https://cloud.siliconflow.cn/i/rnbA6i6U各种大模型 下面介绍我是如如接入vscode的 左边生成一个key,呆会vscode要用,不然401. 打开vscod,电脑能上网。下插件。 下好要配置 点它一下。 要配置,全…

Mac端homebrew安装配置

拷打了一下午o3-mini-high,不如这位博主的超强帖子,10分钟结束战斗 跟随该文章即可,2025/2/19亲测可行 mac 安装HomeBrew(100%成功)_mac安装homebrew-CSDN博客文章浏览阅读10w次,点赞258次,收藏837次。一直觉得自己写…

安全启动(secure boot)怎么关闭_史上最全的各品牌机和组装机关闭安全启动教程

很多网友发现电脑BIOS设置中都有一个secure boot(安全启动)选项,而且一些预装win10或win11改Win7的教程中也有提到要把安全启动关闭,那么我们该怎么关闭安全启动呢?下面教大家各品牌机和组装机关闭安全启动教程。 secure boot该关还是开&…

C进阶 自定义类型

目录 前言 一 结构体 二 结构体的存储 三 位段 四 枚举 五 联合体 总结 前言 我们之前学习的int char double ......都是内置类型,但是我们今天所学习的是自定义类型,比如联合体,结构体,枚举 一 结构体 结构体是一…

STM32的HAL库开发---ADC采集内部温度传感器

一、STM32内部温度传感器简介 二、温度计算方法 F1系列: 从数据手册中可以找到V25和Avg_Slope F4、F7、H7系列只是标准值不同,自行查阅手册 三、实验简要 1、功能描述 通过ADC1通道16采集芯片内部温度传感器的电压,将电压值换算成温度后&…

【PyQt5】python可视化开发:PyQt5介绍,开发环境搭建快速入门

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

Android 串口通信

引言 在iot项目中,Android 端总会有和硬件通信。 通信这里:串口通信,蓝牙通信或者局域网通信。 这里讲一下串口通信。 什么是串口? “串口”(Serial Port)通常是指一种用于与外部设备进行串行通信的接口。…

跟据spring boot版本,查看对应的tomcat,并查看可支持的tomcat的版本范围

一 查看springboot自带的tomcat版本: 可直接在项目中找到Maven Dependencies中找到tomcat版本 二、查看SpringBoot内置tomcat版本的支持范围 我这边是跟据maven仓库查看的 首先跟据链接打开maven仓库:https://mvnrepository.com/ 然后搜索&#xff1a…