## **连接池** 连接池的作用:连接池是将已经创建好的连接保存在池中,当有请求来时,直接使用已经创建好的连接对数据库进行访问。这样省略了创建连接和销毁连接的过程。这样性能上得到了提高。 * * * 基本原理是这样的: 建立数据库连接池对象(服务器启动)。 按照事先指定的参数创建初始数量的数据库连接(即:空闲连接数)。 对于一个数据库访问请求,直接从连接池中得到一个连接。如果数据库连接池对象中没有空闲的连接,且连接数没有达到最大(即:最大活跃连接数),创建一个新的数据库连接。 存取数据库。 关闭数据库,释放所有数据库连接(此时的关闭数据库连接,并非真正关闭,而是将其放入空闲队列中。如实际空闲连接数大于初始空闲连接数则释放连接)。 释放数据库连接池对象(服务器停止、维护期间,释放数据库连接池对象,并释放所有连接) * * * think-swoole 默认有实现数据库和缓存连接池功能,涵盖了日常开发的主要场景。 最新的swoole版本支持一键协程,比如redis、mysql等等,很方便。连接池是在这个基础上,解决一些问题和对性能的再一次提升。 使用think-swoole的连接池,需要修改config/swoole.php配置文件: ~~~ //连接池 'pool' => [ 'db' => [ 'enable' => true, // 是否启用,不启动设置为false 'max_active' => 100, // 最大连接数,超过将不再新建 'max_wait_time' => 5, // 超时时间 ], 'cache' => [ 'enable' => true, // 是否启用,不启动设置为false 'max_active' => 30, // 最大连接数,超过将不再新建 'max_wait_time' => 5, // 超时时间 ], ], ~~~ > 为什么enable设置为true,就启动了连接池呢? 因为在`InteractsWithServer->onWorkerStart()`事件中开启了协程,调用了`prepareApplication`,对`db`、`cache`进行重新绑定,替换为连接池实例 ~~~ protected function prepareApplication() { if (!$this->app instanceof SwooleApp) { $this->app = new SwooleApp($this->container->getRootPath()); $this->app->bind(SwooleApp::class, App::class); $this->app->bind(Server::class, $this->getServer()); $this->app->bind("swoole.server", Server::class); //绑定连接池 if ($this->getConfig('pool.db.enable', true)) { $this->app->bind('db', Db::class); } if ($this->getConfig('pool.cache.enable', true)) { $this->app->bind('cache', Cache::class); } $this->app->initialize(); $this->prepareConcretes(); } } ~~~