在慢速网络下利用短连接,连接的开销会很大;在生产繁忙的系统中,连接也可能会受到系统端口数的限定,如果要每秒建立几千个连接,那么连接断开后,端口不会被立时回收利用,必须经历一个“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连接,但很有可能绝大部分都是就寝(sleep)状态的,这样的事情办法不足高效,而且连接霸占内存,也会导致内存的摧残浪费蹂躏。
对付扩展性好的站点来说,实在大部分的访问并不须要连接数据库。如果用户须要频繁访问数据库,那么可能会在流量增大的时候产生性能问题,此时是非连接都是无法办理问题的,以是该当进行合理的设计和优化来避免性能问题。
如果客户端和MySQL数据库之间有连接池或Proxy代理,一样平常在客户端推举利用短连接。对付长连接的利用一定要慎重,不可滥用。如果没有每秒几百、上千的新连接要求,就不一定须要长连接,也无法从长连接中得到太多好处。在Java措辞中,由于有连接池,如果掌握得当,则不会对数据库有较大的冲击,但PHP的长连接可能导致数据库的连接数超过限定,或者占用过多的内存。
对此,研发工程师、系统运维工程师、DBA须要保持沟通,确定合理的连接策略,千万不要不假思虑就采取长连接。
3. 连接池由于一些数据库创建和销毁连接的开销很大,或者相对付所实行的详细数据操作,连接所耗的资源过多,此时就可能须要添加连接池来改进性能。
数据库连接池是一些网络代理做事或运用做事器实现的特性,如J2EE做事器,它实现了一个持久连接的“池”,许可其他程序、客户端来连接,这个连接池将被所有连接的客户端共享利用,连接池可以加速连接,也可以减少数据库连接,降落数据库做事器的负载。
4. 持久连接和连接池的差异长连接是一些驱动、驱动框架、ORM工具的特性,由驱动来保持连接句柄的打开,以便后续的数据库操作可以重用连接,从而减少数据库的连接开销。而连接池是运用做事器的组件,它可以通过参数来配置连接数、连接检测、连接的生命周期等。
如果连接池或长连接利用的连接数很多,有可能会超过数据库实例的限定,那么就须要留神连接干系的设置了,比如连接池的最小、最大连接数设置,以及php-fpm的进程个数等,否则程序将不能申请新的连接。