首页 > 数据库 >数据库连接池

数据库连接池

时间:2023-11-15 23:11:37浏览次数:32  
标签:需要 队列 数据库 线程 连接 连接池

目录

连接池概述

我们在进行数据库操作的时候为了提高数据库(关系型数据库)的访问瓶颈,除了在服务器端增加缓存服务器(例如redis)缓存常用的数据之外,还可以增加连接池,来提高数据库服务器的访问效率。

一般来说,对于数据库操作都是在访问数据库的时候创建连接,访问完毕断开连接。但是如果在高并发情况下,有些需要频繁处理的操作就会消耗很多的资源和时间,比如:

  1. 建立通信连接的TCP三次握手
  2. 数据库服务器的连接认证
  3. 数据库服务器关闭连接时的资源回收
  4. 断开通信连接的TCP四次挥手
    如果使用数据库连接池会减少这一部分的性能损耗。

接下来会基于MySql数据库(使用MySQL的API连接MySQL数据库)为大家讲解一下,如何使用C++11的相关新特性来实现一个数据库连接池。

连接池的设计

要设计一个数据库连接池,我们需要实现以下几个功能点:

  • 连接池只需要一个实例,所以连接池类应该是一个单例模式的类
  • 所有的数据库连接应该维护到一个安全的队列中
    • 使用队列的目的是方便连接的添加和删除
    • 所谓的安全指的是线程安全,也就是说需要使用互斥锁来保护队列数据的读写。
  • 在需要的时候可以从连接池中得到一个或多个可用的数据库连接
    • 如果有可用连接,直接取出
    • 如果没有可用连接,阻塞等待一定时长然后再重试
  • 如果队列中没有多余的可用连接,需要动态的创建新连接
  • 如果队列中空闲的连接太多,需要动态的销毁一部分
  • 数据库操作完毕,需要将连接归还到连接池中

细节分析

  1. 数据库连接的存储:可用使用STL中的队列queue
  2. 连接池连接的动态创建:这部分工作需要交给一个单独的线程来处理
  3. 连接池连接的动态销毁:这部分工作需要交给一个单独的线程来处理
  4. 数据库连接的添加和归还:这是一个典型的生产者和消费者模型
    消费者:需要访问数据库的线程,数据库连接被取出(消费)
    生产者:专门负责创建数据库连接的线程
    处理生产者和消费者模型需要使用条件变量阻塞线程
  5. 连接池的默认连接数量:连接池中提供的可用连接的最小数量
    如果不够就动态创建
    如果太多就动态销毁
    6.连接池的最大连接数量:能够创建的最大有效数据库连接上限
  6. 最大空闲时间:创建出的数据库连接在指定时间长度内一直未被使用,此时就需要销毁该连接。
  7. 连接超时:消费者线程无法获取到可用连接是,阻塞等待的时间长度

标签:需要,队列,数据库,线程,连接,连接池
From: https://www.cnblogs.com/liviayu/p/17835098.html

相关文章

  • Mysql数据库查询之模糊查询
    一、什么是模糊查询模糊查询是根据一定的模式匹配规则,查找与指定条件相似或相符的数据。二、模糊查询实操通配符查询1、%表示任意0个或多个字符形式一:select查询字段from表名where字段like’%’代码演示查询结果 形式二:select查询字段from表名where字段like......
  • 高斯数据库HCNA之数据库开发环境
    一、GaussDB数据库驱动驱动概念介绍数据库驱动是应用程序和数据库存储之间的一种接口,数据库厂商为了某一种开发语言环境(比如Java、C)能够实现数据库调用而开发的类似翻译员功能的程序,将复杂的数据库操作与通信抽象成为了当前开发语言的访问接口,因此,为了满足用户需求,GaussDB100同......
  • SQL server 恢复数据库
    1、查找已置疑的数据库文件存放位置;2、将SQL数据库停止;3、将置疑的数据库的数据文件RongShiYKT.mdf、RongShiYKT_Log.Ldf文件拷贝到其他目录备份;4、重启SQL数据库,将置疑的数据分离5、重建一个与置疑数据库同名称的新数据库RongShiYKT;6、停止SQL服务器,将备份的旧数据文件RongS......
  • openGauss学习笔记-124 openGauss 数据库管理-设置账本数据库-查看账本历史操作记录
    openGauss学习笔记-124openGauss数据库管理-设置账本数据库-查看账本历史操作记录124.1前提条件系统中需要有审计管理员或者具有审计管理员权限的角色。数据库正常运行,并且对防篡改数据库执行了一系列增、删、改等操作,保证在查询时段内有账本操作记录结果产生。124.2背景......
  • JDBC、数据库连接池、Spring JDBC:JdbcTemplate
    JDBCJDBC(JavaDataBaseConnectivity)概念:Java数据库连接,就是通过Java语言操作数据库。JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实......
  • 人大金仓数据库设置大小写敏感
    1.  人大金仓数据库应设置大小写不敏感1.1. 大小写敏感检查方法1.1.1. V8R3版本检查方法:在人大金仓数据库客户端执行语句:showcase_sensitive;返回结果on:表示大小写敏感;返回结果off:表示大小写不敏感1.1.2. V8R6版本检查方法:执行语句:showenable_ci;返回......
  • 基于 Amazon EKS 搭建开源向量数据库 Milvus
    一、前言生成式AI(GenerativeAI)的火爆引发了广泛的关注,也彻底点燃了向量数据库(VectorDatabase)市场,众多的向量数据库产品开始真正出圈,走进大众的视野。根据 IDC的预测,到2025年,超过80%的业务数据将是非结构化的,以文本、图像、音频、视频或其他格式存储。而大规模存储和查......
  • 数据库表被锁住,如何解决?
    SELECTA .*FROM pg_stat_activityA, pg_locksb, pg_classCWHERE A.pid=b.pid ANDA.sessionid=b.sessionid ANDb.relation=C.oid ANDA.datname='mes' ANDC.relname='edcresultitem' --ANDwaiting=trueORDERBY ......
  • 数据库事务是什么?事务的四大特性是什么?
    数据库事务是什么?事务的四大特性是什么?1.数据库事务事务是一组原子性的SQL语句,或者说一个独立的工作单元。如果数据库引擎能够成功地对数据库应用该组操作的全部语句,那么就执行该组查询。如果其中任何一条语句因为崩溃或其他原因无法执行,那么所有的语句都不会执行。也就是说,......
  • MySQL Shell连接数据库报MySQL Error 1045 (28000)错误浅析
    这里简单总结一下mysqlshell访问数据库时报MySQLError1045(28000):Accessdeniedforuser'root'@'::1'(usingpassword:YES)的原因以及如何解决这个问题这里测试的环境为MySQL8.0.35,我们先来看看报错案例:$ mysqlsh -h localhost -P 7306 -u root -pPlease pr......