当前位置: 首页 > 科技观察

什么是连接池?如何实现连接池?

时间:2023-03-14 09:21:01 科技观察

什么是连接池?在实际应用开发中,一般会有很多访问下游的需求(下游包括但不限于服务/数据库/缓存)。当并发很低的时候,一般不会有问题。但是当服务单机QPS达到几百、几千甚至几万的时候,如果每次访问还是要经过建立连接=》发送接收请求=》关闭连接=》释放资源等步骤,系统的性能必然会急剧下降,甚至可能导致系统崩溃,连接池是解决这个问题最常用的方法,它的思想很简单,就是在服务启动的时候,一些connections是先建立的,有request来了,先取出一个,再进行下游的操作。back,避免重复建立和销毁连接,提高性能连接池如何实现连接池是一个独立的服务并且需要常驻进程,一个完整的连接池操作通常经过以下几个步骤:(1)建立连接池对象(服务启动)(2)创建初始编号r个连接数(即空闲连接数)根据事先指定的参数。(3)对于访问请求,直接从连接池中获取连接。如果连接池对象中没有空闲连接,并且连接数没有达到最大值(即:最大活动连接数),则创建一个新连接;如果达到最大值,则设置一定的超时时间来获取连接。(4)使用连接访问服务。(5)接入服务完成,释放连接(此时释放连接并没有真正关闭,而是放入空闲队列。如果实际空闲连接数大于初始空闲连接数,连接被释放)。(6)释放连接池对象(在服务停止和维护期间,释放连接池对象并释放所有连接)。Java对连接池比较友好,有很多成熟的方案,比如DBCP、C3P0、Druid等,PHP在这方面比较薄弱。虽然Mysql提供了长连接API,但是在PHP机器数量多、规模大的情况下,mysql_pconnect不仅不能节省MySQL资源,反而会增加数据库的负载。这主要是因为需要依赖apache或者fpm。例如,假设有100台PHP应用服务器,每台机器需要启动100个apache或fpm工作进程,每个进程都会产生一个到MySQL的长连接,所以总共有10000个MySQL连接。众所周知,MySQL的每个连接占用一个线程。如果有10000个连接,那么MYSQL就需要创建10000个线程,那么大量的系统资源就会浪费在线程间的上下文切换上。其实你的业务代码中并不是所有的地方都在做数据库操作,所以如果创建了那么多连接,但是其中有很多是空闲的,那就是一种资源浪费。鉴于此,PHP要想独立解决连接复用问题,就必须实现自己的连接池。幸运的是,PHP扩展swoole可以做到这一点。使用swoole提供的任务功能可以很方便的做一个连接池。下面是使用swoole实现连接池的部分代码:通过这段代码,PHP可以实现连接池,解决连接不能复用的问题。当然,以上只是一个例子。如果你想在生产环境中使用它,这肯定是不够的。这里推荐一个现成的工具——SMProxy。SMProxy是基于mysql协议使用swoole开发的mysql数据库连接池。具有以下特点:支持读写分离支持数据库连接池,有效解决PHP带来的数据库连接瓶颈支持SQL92标准采用协程调度支持多数据库连接,多数据库,多用户,灵活搭配兼容MySQL原生协议、跨语言、跨平台通用中间件代理支持MySQL事务支持HandshakeV10协议版本完美兼容MySQL5.5-8.0兼容各大框架,无缝提升性能另外还支持Laravel、ThinkPHP等国内主流框架.因此,如果您使用的是PHP并想使用连接池,请查看此工具。