mysql长链接与短链接

什么是长链接?php

其实长链接是相对于一般的短链接而说的,也就是长时间保持客户端与服务端的链接状态。mysql

一般的短链接操做步骤是:sql

链接-》数据传输-》关闭链接;数据库

而长链接一般就是:服务器

链接-》数据传输-》保持链接-》数据传输-》保持链接-》…………-》关闭链接;网络

这就要求长链接在没有数据通讯时,定时发送数据包,以维持链接状态,短链接在没有数据传输时直接关闭就好了并发

何时用长链接,短链接?socket

长链接主要用于在少数客户端与服务端的频繁通讯,由于这时候若是用短链接频繁通讯常会发生Socket出错,而且频繁建立Socket链接也是对资源的浪费。tcp

可是对于服务端来讲,长链接也会耗费必定的资源,须要专门的线程(unix下能够用进程管理)来负责维护链接状态。函数

总之,长链接和短链接的选择要视状况而定。

查看mysql链接数

mysqladmin -uroot -p processlist

实际的测试中我发现,当设置了MYSQL_OPT_RECONNECT为1时,超时后再查看processlist,则自动创建的链接不在列表中,但事实上链接确实创建并被使用了。

在MYSQL的默认设置中,若是一个数据库链接超过8小时没有使用(闲置8小时),服务器将断开这条链接,后续在该链接上进行的查询操做都将失败。网络上对该问题的描述很是多。也提供了相应的解决办法。我在这里提一些我本身的见解。

解决办法一:修改MYSQL服务器的配置参数

道理很是简单,MYSQL的默认设置是在数据库链接超过8小时没有使用后将其断开,若是咱们将这个时间改为更大的数值,那么链接超时所需的时间就会更长,也就意味着更不容易超时。网络上提供的修改方法通常是修改/etc/my.cnf,在这个文件中添加一行wait_timeout=你须要设置的超时时间。实际上有一种比较简单的方法来修改这个参数:

首先做为超级用户登陆到MYSQL,注意必须是超级用户,不然后面会提示没有修改权限。而后输入

show global variables like 'wait_timeout';

回车执行后显示目前的超时时间:

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| wait_timeout | 28800 |

+---------------+-------+

1 row in set (0.00 sec)

上面显示的是默认的超时时间,即8个小时(单位是秒)。如今从新设置该参数,例如咱们要将超时时间设置成10个小时,能够输入:

set global wait_timeout=36000;

回车执行,显示:

Query OK, 0 rows affected (0.00 sec)

表示设置成功,能够从新使用show global variables like 'wait_timeout'来验证。

这种方法比较直观,并且设置的参数当即生效。但若是/etc/my.cnf中没有配置,则重启服务后,global变量会从/etc/my.cnf中读取新的变量值。

  譬如 HTTP 的 Connection-alive 若是为 close,则 server 收到一个 request 并发送完一个 response 以后就会主动关闭链接,这就是短链接;若是 Connection-alive keep-alive 的话能够在一个 tcp 链接中交换屡次对话。是这个定义?那就只是个程序结构设计问题了。

长链接短链接只是一个概念性的问题,只要知道其概念,不是一个特殊的东西:
长链接:系统通信链接创建后就一直保持。
短链接:只有系统须要相互发消息链接才创建(客户端发起),请求消息获得响应后链接关闭;
通信实体间使用长链接,通常还须要定义心跳消息,按期发送来检测系统间链路是否异常,每隔必定时间发送一次心跳,若是必定次数没有收到心跳消息,这认为此链接出现问题,须要断开链接从新创建。
具体心跳消息的格式,以及发送间隔,以及多少次没有收到心跳就认为链路异常,以及数据部是否算做心跳消息(有的系统若是接收到数据包则会清除心跳计时器也就至关于系统中的数据包也算做心跳消息);这个须要两端进行协商。好比GSM经常使用的短消息中心和其余网络实体互连的SMPP协议,要求创建的就是长链接.

因此长短链接只是一个概念问题长短链接的socket,就是使用普通的socket函数,没有什么特殊的

数据库链接池由数据库管理器提供。与链接语言无关。php 提供了 pconnect 的機制, 能够實現連接池的功能 .對於 mysql , mysql_pconnect 函數就能够實現 :數據庫連接使用完畢後, 並不釋放, 而是留在系統中, 下一次調用 mysql_pconnect 連接數據庫時, 首先檢查是否有空閒的連接未被使用, 若是有, 則使用這個連接, 而不是進行連接數據庫的操做, 從而節省系統開銷

相关文章
相关标签/搜索