数据库连接池

1. 池化技术?

2. 什么是数据库连接池?

3. 为什么使用数据库连接池?

4. 数据库连接池运行机制

5.连接池和线程池的关系

6.连接池设计要点

7. 连接池的具体实现

8.连接池连接设置数量

 

1. 池化技术?

池化技术能够减少资源对象的创建次数,提高程序的响应性能,特别是在高并发下这种提高更加明显。
使用池化技术缓存的资源对象有如下共同特点:
  1. 对象创建时间长;
  2. 对象创建需要大量资源;
  3. 对象创建后可被重复使用
像常见的线程池、内存池、连接池、对象池都具有以上的共同特点。

2. 什么是数据库连接池?

定义:数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成
一个连接池,由程序动态地对池中的连接进行申请,使用,释放。
大白话:创建数据库连接是一个很耗时的操作,也容易对数据库造成安全隐患。所以,在程序初始化的
时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,可以保证较快的数据库读写速度,
还更加安全可靠。
这里讲的数据库,不单只是指Mysql,也同样适用于Redis。

3. 为什么使用数据库连接池?

3.1普通使用数据库时,需要首先建立TCP连接,账号、密码认证建立数据库连接,执行sql语句,关闭数据库连接,关闭TCP连接。这个步骤浪费时间与资源,可以把建立数据库的连接保存在一个连接容器内,需要执行任务时从连接容器内取出一个连接,任务完成时归还连接,就可以节省很多时间与资源。

优点:

  • 降低了网络开销
  • 连接复用,优先减少了连接数
  • 提升性能,避免频繁的新建连接,新建连接的开销比较大
  • 没有TIME_WAIT状态的问题

缺点:

  设计较为复杂

3.2 长连接和连接池的区别

  • 长连接是一些驱动、驱动框架、ORM工具的特性,由驱动来保持连接句柄的打开,一边后续的数据库操作可以重用连接,从而减少数据库的连接开销。
  • 连接池是应用服务器的组件,它可以通过参数来配置连接数,连接检测、连接的生命周期等。
  • 连接池内的连接,其实就是长连接。

4. 数据库连接池运行机制

  1. 从连接池获取或创建可用连接;
  2. 使用完毕之后,把连接返回给连接池;
  3. 在系统关闭前,断开所有连接并释放连接占用的系统资源;

 

 

 

5.连接池和线程池的关系

 线程池是主动操作,主动执行任务,当任务队列不为空的时候从队列取任务取执行。 

 

连接池是被动操作(类似内存池),池的对象被任务获取,执行完任务后归还。

6 .连接池设计要点

使用连接池需要预先建立数据库连接。

连接池设计思路:

  1. 连接到数据库,设计到数据库ip、端口、用户名、密码、数据库名字等;
    1. 连接的操作,每个连接对象都是独立的连接通道,它们是独立的;
    2. 配置最小连接数和最大连接数。
  2. 配置一个队列管理池的连接,比如list;
  3. 获取连接对象;connection_wait,notify
  4. 归还连接对象;
  5. 连接池的名字。

 第一步:构造函数,赋值 pool_name,db_server_ip(mysql ip地址),db_server_port(mysql端口),username(mysql用户名),password(mysql用户密码),db_name(mysql数据库名称),max_conn_cnt(最大连接数)

 

 

 

第二步:int init()初始化,创建最小数量连接,把连接插入到空闲队列,创建一次来连接要经历三次握手和连接数据库的过程。

 

 

 

第三步: 请求获取连接

 

 

 第四步:归还连接

 

 

 第五步:释放资源

 

 

 

 

 

 

 6.2 mysql连接重连机制

设置启用(当发现连接断开时的)自动重连
my_bool reconnect = true;
mysql_options(m_mysql, MYSQL_OPT_RECONNECT, &reconnect); // 配合mysql_ping实现自动重连
检测连接是否正常 
int STDCALL mysql_ping(MYSQL *mysql);
描述:
检查与服务端的连接是否正常。连接断开时,如果自动重新连接功能未被禁用,则尝试重新连接服务
器。该函数可被客户端用来检测闲置许久以后,与服务端的连接是否关闭,如有需要,则重新连接。
返回值:
连接正常,返回0;如有错误发生,则返回非0值。返回非0值并不意味着服务器本身关闭掉,也有可能
是网络原因导致网络不通。 
6.3 redis重连机制
  1. 使用之前检测连接是否可用
  2. 使用过程中出现连接异常则释放异常
  3. 下一次使用该连接的时候如果发现连接不可用则重新初始化
redis的重连机制设计和mysql有区别。

7. 连接池的具体实现

8.连接池连接设置数量

连接池的连接数量一般与线程的数量是相等的。

连接数 = ((核心数 * 2) + 有效磁盘数)
按照这个公式,即是说你的服务器 CPU 是 4核 i7 的,那连接池连接数大小应该为 ((4*2)+1)=9
这里只是一个经验公式。还要和线程池数量以及具体业务结合在一起。

 

 

posted @   放弃吧  阅读(161)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示