当数据库服务器和客户端位于不同主机时,需要建立网络连接进行通信。客户端必须使用数据库连接来发送命令和接收回复、数据。提供给客户端数据库的驱动程序指定连接字符串后,客户端就可以与数据库建立连接了。您可以参考编程语言手册来了解如何使用短连接和长连接。1、短连接短连接是指程序与数据库通信时需要建立连接,执行完操作后关闭连接。简单来说,短连接就是在每次操作数据库时打开和关闭数据库连接。基本步骤为:连接→数据传输→关闭连接。如果在慢速网络下使用短连接,连接开销会很大;在繁忙的生产系统中,连接也可能受到系统端口数量的限制。如果要每秒建立数千个连接,在连接断开后,端口不会立即被回收,必须经过一个“FIN”阶段等待才能被回收,这可能会导致端口资源不足。在Linux上,可以通过调整/proc/sys/net/ipv4/ip_local_port_range来扩大端口的使用范围;调整/proc/sys/net/ipv4/tcp_fin_timeout以减少恢复延迟(如果要在应用服务器上调整此参数,请小心!)。另一种方法是主机使用多个IP地址。端口数的限制其实是基于同一个IP:PORT。如果主机增加一个IP,MySQL可以监控多个IP地址,客户端也可以选择连接某个IP:PORT,增加了端口资源。2、长连接长连接是指程序之间的连接建立后,一直处于打开状态,被后续程序重用。使用长连接的初衷是为了减少连接开销,虽然MySQL连接比其他数据库快很多。以PHP程序为例,当收到一个永久连接的请求时,PHP会检查是否已经有一个相同的永久连接(之前已经打开)。如果存在,则直接使用该连接;如果没有,将建立一个新的连接。所谓“同一”连接是指用相同的用户名和密码连接到同一台主机。从客户端的角度来看,使用持久连接有一个优势。您不需要每次都创建一个新连接。如果客户端对MySQL服务器有频繁的连接请求,永久连接的效率会更高。对于高并发的业务,如果可能会遇到连接的影响,建议使用长连接或者连接池。从服务器的角度来看,情况略有不同,它可以节省创建连接的开销,但维护连接也需要内存。如果滥用长连接,可能会使用过多的MySQL服务器连接。现代操作系统可以有数以千计的MySQL连接,但很可能大部分都处于休眠状态。这种工作方式效率不够,连接占用内存,也会导致内存浪费。对于扩展性好的站点,其实大部分的访问是不需要连接数据库的。如果用户需要频繁访问数据库,当流量增加时,可能会出现性能问题。这时候长短连接是解决不了问题的,所以要进行合理的设计和优化,避免出现性能问题。如果客户端和MySQL数据库之间有连接池或者代理,一般建议在客户端使用短连接。长连接的使用一定要谨慎,不能滥用。如果每秒没有数百或数千个新的连接请求,则不需要长连接,也无法从长连接中获得多少好处。在Java语言中,由于连接池的存在,如果控制得当,不会对数据库造成太大的影响,但是PHP的长连接可能会导致数据库连接数超过限制,或者占用太多很多内存。对此,研发工程师、系统运维工程师、DBA需要保持沟通,确定合理的连接策略,千万不要不假思索地使用长连接。3.连接池由于有些数据库创建和销毁连接的开销很大,或者连接相对于执行的具体数据操作消耗了过多的资源,可能需要添加连接池来提高性能。数据库连接池是一些网络代理服务或应用服务器实现的一个特性,比如J2EE服务器,它实现了一个持久连接的“池”,允许其他程序和客户端进行连接。这个连接池会被所有连接的客户端共享使用,连接池可以加快连接速度,也可以减少数据库连接,减轻数据库服务器的负载。4、持久连接和连接池的区别持久连接是一些驱动、驱动框架、ORM工具的特性。驱动程序保持连接句柄打开,以便后续的数据库操作可以重用连接,从而减少数据库的连接开销。连接池是应用服务器的一个组件,可以通过参数配置连接数、连接检测、连接生命周期等。如果连接池或者长连接使用了很多连接,可能会超过数据库实例的限制,那么就需要注意连接相关的设置,比如连接池的最小连接数和最大连接数,以及php-fpm进程数等待,否则程序将无法申请新的连接。
