> 文档中心 > 2022年5月28日记:Linux服务器开发,Darren老师,mysql连接池的实现

2022年5月28日记:Linux服务器开发,Darren老师,mysql连接池的实现

推荐一个 零声学院 免费公开课程,个人觉得老师讲得不错,分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习]
后台服务器:https://course.0voice.com/v1/course/intro?courseId=5&agentId=0
────────────────────────────────────

1、池化技术

我们获取资源需要不断创建和释放,我们可以给它放到池里面,等我们不需要的时候再做统一的销毁。

2、什么是数据库连接池

线程池是主动的操作,连接池是被动的操作。
创建数据库连接时一个耗时的操作,也容易对数据库造成安全隐患。所以,在程序初始化的时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,也可以保证较快的数据库读写速度,还更加安全可靠。

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

2022年5月28日记:Linux服务器开发,Darren老师,mysql连接池的实现

3.1、不使用连接池

上百个人注册,通过服务器去连接数据库,这样会非常耗时。

3.2、使用连接池

2022年5月28日记:Linux服务器开发,Darren老师,mysql连接池的实现
通过我们从容器中取连接,就去执行sql语句,节省很多资源时间。
优点:

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

缺点:

  • 设计比较复杂

3.3、长连接和连接池的区别

纯粹的长连接

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

2022年5月28日记:Linux服务器开发,Darren老师,mysql连接池的实现
线程用到就去申请,用不到就去释放。

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

线程池主动调用任务。当任务队列不为空的时候从队列取任务执行。
连接池被动的被任务使用。当某任务需要操作数据库时,只要从连接池取一个连接对象,当任务使用完用完连接对象后,将该对象放回到连接池中。

6、线程池的设计要点

2022年5月28日记:Linux服务器开发,Darren老师,mysql连接池的实现
1、连接到数据库,涉及到数据库ip,端口,用户名,密码,数据库名字等;
1.连接的操作,每个连接对象都是独立的连接通道,它们是独立的。
2、配置最小连接数和最大连接数。
2、需要一个队列管理他的连接,比如使用list。
3、获取连接对象。
4、归还连接对象。
5.连接池的名字。

6.1、连接池设计逻辑

6.2、mysql连接重连机制

6.3、redis重连机制

7、连接池的具体实现

问:4个连接池对象和4个线程使用4个连接池做同样的事情吗?还是区分每个线程不同的事情。
答:连接池只是提供连接池对象,提供了一条连接通道,至于调用者要拿这个连接对象做什么业务是用调用者去决定的。出去业务解耦合的场景,也可以设置不同的线程池和不同的连接池对不同的业务,比如即使通讯写入聊天记录和读取聊天记录采用不同的线程池和对象池。

8、连接池连接设置数量

2022年5月28日记:Linux服务器开发,Darren老师,mysql连接池的实现

总结