什么是连接池?如何确认连接池的大小?

对于我们编写的几乎每个网络或移动应用程序来说,其底层的关键组件之一就是数据库。对于编写使用数据库且高性能且资源高效的应用程序,必须处理一项关键资源,但与 CPU、内存等不同,它通常不是很明显。该资源是数据库连接。

什么是数据库连接?

图片

使用MySQL作为DB的数据库连接

数据库连接是由数据库驱动程序创建的对象,数据库驱动程序是一个软件,用于管理与数据库通信的细节,并使我们的应用程序代码能够轻松地使用数据库。例如,MySQL连接可以通过com.mysql.jdbc.Driver驱动程序创建。连接维护许多东西,其中包括用于数据交换的套接字 (套接字是两台机器之间连接的松散逻辑表示)以及与数据库的会话,与典型的 Web 会话非常相似。

需要连接池

连接管理不善的陷阱

未正确关闭数据库连接是难以检测的错误来源。最常见的错误是:

  1. 'Too many connections'错误,数据库不接受客户端连接进行查询处理。

  2. 某种形式的内存溢出(例如:'Heap OutOfMemoryError'):由于打开的连接在内存中累积而发生。

即使 Web 应用程序中服务请求的单个位置没有正确关闭连接,随着时间的推移,也可能会因上述错误而导致应用程序崩溃。

使用连接池通常可以减少或消除此类错误。

引入连接池的效果

考虑以下简单程序,它在数据库上运行 1000 个查询:

for i = 1 to 1000    connection = Driver.getConnection()    result = connection.executeQuery(query)    connection.close()

上面代码中我们创建和关闭连接的次数随着执行的查询数量线性增加。

该程序可以通过使用一个非常简单的连接池来高度优化,连接池只是活动数据库连接的缓存。​​​​​​​

Pool = CreateConnectionPool(size = 2)for i = 1 to 1000    connection = Pool.getConnection()    result = executeQuery(query, connection)    Pool.returnConnection(connection)

图片

连接池的简化表示

在这里,创建连接被从池中获取连接所取代,而关闭连接则被返回到池中所取代,后者速度更快。

无池(~34 秒)


// Query Execution without pool ---> ~34 sec
public static void main(String[] args) throws SQLException {
    long start = System.currentTimeMillis();
    for(int i = 0 ;i < 1000; i++){
        // 1. Application will load the suitable MySQL Driver, eg: com.mysql.jdbc.Driver, com.mysql.cj.jdbc.Driver
        // 2. Driver will connect to the MySQL DB using the provided URL for the DB and credentials
        // 3. Driver will return a connection object corresponding to created DB connection
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/my_db", "root", "");
        
        connection.createStatement().execute("select count(*) from places");
        
        // release connection
        connection.close();
    }
    System.out.println(System.currentTimeMillis() - start);

带池(非常幼稚的实现)(~16 秒)


//Query execution using a very simplistic Connection Pool ---> ~16 sec
public static void main(String[] args) throws SQLException {
    long start = System.currentTimeMillis();

    // create pool
    List<Connection> pool = new ArrayList<>();
    for(int i = 0; i < 10;i++){
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/my_db", "root", "");
        pool.add(connection);
    }

    Random r = new Random();
    for(int i = 0 ;i < 1000; i++){
        // get connection
        int randomIdx = r.nextInt(10);
        Connection connection = pool.get(randomIdx);
        pool.remove(randomIdx);

        connection.createStatement().execute("select count(*) from places");
        
        // release connection
        pool.add(randomIdx, connection);

    }
    System.out.println(System.currentTimeMillis() - start);
}

连接池虽然以非常简单的方式实现,但却导致程序执行时间减少了50% 以上(执行时间从 34 秒至 16 秒)。

复杂的连接池库,例如HikariCP、C3P0等,可以带来巨大的性能提升并为您的应用程序带来资源效率。

如何确定连接池的大小

假设您有一个 Web 应用程序,其中处理每个请求都需要对数据库记录执行操作,并且您在阅读本文后决定使用连接池。

如果您的 Web 应用程序要处理 100 个并发请求的负载,那么连接池的大小应该是多少?100,对吗(每个请求 1 个)?

答案是,这取决于几个因素,而且大多数情况下,必须通过实验得出适当的值。需要考虑的一些因素如下:

  1. 您的网络应用程序处理的并发请求数

  2. 平均查询执行时间

  3. DB资源(CPU核心、磁盘速度)

但它通常比人们通常想象的要低。例如,对于上例中的 100 个并发请求,好的池大小大多不会大于 10。最后,这里有一个图可以直观地考虑大小调整:

图片

作者:Ajay Joshi

更多技术干货请关注公号【云原生数据库

squids.cn,云数据库RDS,迁移工具DBMotion,云备份DBTwin等数据库生态工具。

irds.cn,多数据库管理平台(私有云)。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

调用Win10隐藏的语音包

起因 在做一个文本转语音的Demo的时候&#xff0c;遇到了语音包无法正确被Unity识别的问题。明明电脑上安装了语音包但是代码就是识别不出来 原因 具体也不是非常清楚&#xff0c;但是如果语言包是在的话&#xff0c;大概率是Win10系统隐藏了。 确定语言包 首先查看%windi…

VLAN详细学习

文章目录 VLAN概念VLAN种类端口VLAN工作原理以太网的三种链路类型配置 VLAN概念 一种讲局域网设备从逻辑上划分为一个个网段&#xff0c;从而实现虚拟网络的一种技术&#xff0c;这一技术主要应用于交换机中。Vlan技术是技术在以太网帧的基础上增加vlan头&#xff0c;用VLAN I…

云计算大屏,可视化云计算分析平台(云实时数据大屏PSD源文件)

大屏组件可以让UI设计师的工作更加便捷&#xff0c;使其更高效快速的完成设计任务。现分享可视化云分析系统、可视化云计算分析平台、云实时数据大屏的大屏Photoshop源文件&#xff0c;开箱即用&#xff01; 若需 更多行业 相关的大屏&#xff0c;请移步小7的另一篇文章&#…

代码随想录算法训练营第50天| 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV

JAVA代码编写 123.买卖股票的最佳时机III 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 **注意&#xff1a;**你不能同时参与多笔交易&#xff08;你必须在再次购买前出…

记录 | ubuntu上安装fzf

在 ubuntu 上采用命令行安装 fzf 的方式行不通 指的是采用下面的方式行不通&#xff1a; sudo apt install fzf # 行不通 sudo snap install fzf --classic # 行不通正确的安装方式是&#xff1a; ● 到 fzf 的 git 仓库&#xff1a;https://github.com/junegunn/fzf/re…

aardio网页组件:webPageOperation

webPageOperation是webview的初步封装&#xff0c;用来网页填表、操作网页。可操作web.form、web.view、web.view2等浏览器组件。 使用方法 首先把webPageOperation.aardio&#xff08;源码在后面&#xff09;放到~\lib\godking目录下&#xff0c;然后新建窗口项目&#xff…

Leetcode—10.正则表达式匹配【困难】

2023每日刷题&#xff08;五十八&#xff09; Leetcode—10.正则表达式匹配 算法思想 参考题解 实现代码 class Solution { public:bool isMatch(string s, string p) {int m s.size(), n p.size();vector<vector<bool>> dp(m 1, vector<bool>(n …

基于单片机智能循迹小车仿真设计

**单片机设计介绍&#xff0c;基于单片机智能循迹小车仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的智能循迹小车是一种通过传感器检测地面情况&#xff0c;并根据设定的规则进行动作控制的机器人。它使用…

信号量机制及信号量实现进程同步、互斥、前驱关系

进程互斥的四种软件实现万式&#xff08;单标志法、双标志先检查、双标志后检查、Peterson算法)进程互斥的三种硬件实现方式&#xff08;中断屏蔽方法、TS/TSL指令、Swap/XCHG指令&#xff09; 1.在双标志先检查法中&#xff0c;进入区的“检查”、“上锁”操作无法一气呵成&am…

性能测试、负载测试、压力测试之间的差异!

1、什么是性能测试 性能测试是一种用于确定计算机、网络或设备速度的测试。它通过在不同的负载场景中传递不同的参数来检查系统组件的性能。 2、什么是负载测试 负载测试是在任何应用程序或网站上模拟实际用户负载的过程。它检查应用程序在正常和高负载期间的行为。当开发项目…

CAN 三: STM32 CAN相关寄存器介绍

1、寄存器列表&#xff08;F1/F4/F7&#xff09; 寄存器名称作用CAN_MCRCAN主控制寄存器主要负责CAN工作模式的配置CAN_BTR位时序寄存器用来设置分频/TBS1/TBS2/TSWJ等参数&#xff0c;设置测试模式CAN_(T/R)IxR标识符寄存器存放(待发送/接收)的报文ID、扩展ID、IDE位及RTR位C…

[c]零钱兑换

题目比较简单&#xff0c;看答案就能看懂什么意思 #include<stdio.h> int main() {int count 0;int n;scanf("%d", &n);for (int i 0; i < n; i){for (int k 0; k <n/2; k){for (int j 0; j < n/5 ; j){if (i 2 * k 5 * j n){count;}}}}p…

ZXing生成二维码

&#x1f60a; 作者&#xff1a; 瓶盖子io &#x1f496; 主页&#xff1a; 瓶盖子io-CSDN博客 1.介绍 Android Zxing框架 生成二维码扫码功能;ZXing是一个开源的类库&#xff0c;是用Java编写的多格式的1D / 2D条码图像处理库&#xff0c;使用ZXing可以生成、识别QR Code(…

Servlet 的初步学习

前言 咱们最核心的目标是基于tomcat编程, 做出网站来 ~~ 基于tomcat进行网站后端的开发. 网站后端, http服务器,肯定是需要针对http 协议进行一系列操作的. 幸运的是, tomcat,已经把这些http相关的底层操作,封装好了只需要调用tomcat给咱们提供的api即可 Servlet 是什么 Servl…

做数据分析为何要学统计学(6)——什么问题适合使用卡方检验?

卡方检验作为一种非常著名的非参数检验方法&#xff08;不受总体分布因素的限制&#xff09;&#xff0c;在工程试验、临床试验、社会调查等领域被广泛应用。但是也正是因为使用的便捷性&#xff0c;造成时常被误用。本文参阅相关的文献&#xff0c;对卡方检验的适用性进行粗浅…

基于Java8构建Docke镜像

基于Java8构建Docke镜像 搜索java8安装包 docker search java8 --no-trunc &#xff0c; --no-trunc展开描述信息 选择拉取 docker pull docker.io/mykro/java8-jre&#xff0c;为了减少磁盘占用&#xff0c;选择jre版本基础镜像 在宿主机创建文件夹iot&#xff0c;并把所需…

opencv 十五 红外图像中虹膜的提取

一、算法需求 在医疗检测中&#xff0c;需要使用红外相机拍摄眼睛照片&#xff0c;然后提取出虹膜的区域。在拍摄过程瞳孔需要进行运动&#xff0c;其通常不在正前方&#xff0c;无法形成圆形&#xff0c;不能使用常规的霍夫圆检测进行提取定位。且在在红外图像中&#xff0c;…

Java 语言关键字

Java关键字是电脑语言里事先定义的&#xff0c;有特别意义的标识符&#xff0c;有时又叫保留字&#xff0c;还有特别意义的变量。Java的关键字对Java的编译器有特殊的意义&#xff0c;他们用来表示一种数据类型&#xff0c;或者表示程序的结构等&#xff0c;关键字不能用作变量…

鸿蒙OS应用开发者高级认证题库

一、判断题 云函数打包完成后&#xff0c;需要到AppGallery Connect创建对应函数的触发器才可以在端侧中调用&#xff08;错&#xff09; 在column和Row容器组件中&#xff0c;aligntems用于设置子组件在主轴方向上的对齐格式&#xff0c;justifycontent用于设置子组件在交叉轴…

IO零拷贝

在介绍零拷贝之前我们先看看传统的 Java 网络 IO 编程是怎样的。 下面代码展示了一个典型的 Java 网络程序。 File file new File("index.jsp");RandomAccessFile rdf new RandomAccessFile(file, "rw");byte[] arr new byte[(int) file.length()];rdf…