如何合理评估数据库连接池大小
php数据库连接有连接池吗?
php数据库连接有连接池吗?
原本没有,不过有些中间层的服务器组件,但如果是连mysql,php直接连已经很快了,用那些中间件反而影响性能。
你也可以根据实际需求,使用pdo的长连接。
如果系统中有长事务和短事务,如何设置连接池大小?如何设置数据库服务器的最大连接数?
我们知道,数据库连接池的大小并非越大越好,这个要根据数据库服务器的硬件配置来定,就拿mysql来说,如果是8核CPU,如果最大连接数很大,并且真的建立了这么多连接,会因为线程上下文切换等等原因导致等待时间变长,并且吞吐量或许会降低,那么现在问题来了:我们系统中事务,有些是长事务,有些是短事务,如果短事务的话,我们可以将数据库连接池设置的小一点,但是如果是长事务怎么办呢?
区分出业务模块,把每个模块的对应的配置抽象出来按需加载其自己的配置,按这种思路不仅仅可以做到长短连接的区别配置,而且可以任意的配置连接数据库的不同参数
怎么查询mysql的最大连接数?
数据库连接池并不能减少MySQL查询的消耗,而是为了避免MySQL维持大量的数据库连接.
MySQL最大连接数max_connections默认值为151(最大值可以过万). 假设一个worker进程保持一个到MySQL的长连接. 当Swoole服务的worker进程数(对应CPU核心数)超过151时,MySQL默认会拒绝新的连接. 假设一台服务器CPU核心数为32,开启32个Swoole worker进程. 当服务器数量达到4台时(32*4128),MySQL才需要考虑配置更大的max_connections. 把max_connections调整为1510(默认值的10倍),可供40台Swoole应用服务器使用. 可见,当Swoole应用服务器过百时,数据库连接池才有意义,否则就是简单问题复杂化.
Swoole的MySQL连接池是通过异步swoole_mysql SplQueue来实现的.
一般情况下,用PDO长连接就行了,连Swoole提供的异步MySQL客户端都可以不用,这样能保证数据库逻辑能够同步顺序书写,不需要像异步那样嵌套回调.