![alt](https://img-blog.csdnimg.cn/img_convert/1832059eb3d753523c2d940d2b9fe55b.png)
1. 通信协议
我们的程序或者工具要操作数据库,第一步要做什么事情? 跟数据库建立连接。
首先,MySQL必须要运行一个服务,监听默认的3306端口。在我们开发系统跟第三方对接的时候,必须要弄清楚的有两件事。
-
第一个就是通信协议,比如我们是用HTTP还是WebService还是TCP? -
第二个是消息格式,比如我们用XML格式,还是JSON格式,还是定长格式?报文头长度多少,包含什么内容,每个字段的详细含义。
MySQL是支持多种通信协议的,可以使用同步/异步的方式,支持长连接/短连接。我们分别来看:
同步通信
同步通信依: 赖于被调用方,受限于被调用方的性能。也就是说,应用操作数据库,线程会阻塞,等待数据库的返回。一般只能做到一对一,很难做到一对多的通信。
异步通信
异步可以避免应用阻塞等待,但是不能节省SQL执行的时间。
如果异步存在并发,每一个SQL的执行都要单独建立一个连接,避免数据混乱。但是这样会给服务端带来巨大的压力(一个连接就会创建一个线程,线程间切换会占用大量CPU资源)。另外异步通信还带来了编码的复杂度,所以一般不建议使用。如果要异步,必须使用连接池,排队从连接池获取连接而不是创建新连接。
长连接与短连接
MySQL既支持短连接,也支持长连接。短连接就是操作完毕以后,马上close掉。长连接可以保持打开,减少服务端创建和释放连接的消耗,后面的程序访问的时候还可以使用这个连接。一般我们会在连接池中使用长连接。
保持长连接会消耗内存。长时间不活动的连接,MySQL服务器会断开。
showglobalvariableslike'wait_timeout';--非交互式超时时间,如JDBC程序
showglobalvariableslike'interactive_timeout';--交互式超时时间,如数据库工具
默认都是28800秒,8小时。
可以用showstatus
命令:showglobalstatuslike'Thread%';
Threads_cached:缓存中的线程连接数。
Threads_connected:当前打开的连接数。
Threads_created:为处理连接创建的线程数。
Threads_running:非睡眠状态的连接数,通常指并发连接数。
MySQL支持哪些通信协议呢?
UnixSocket
比如我们在Linux服务器上,如果没有指定-h参数,它就用socket方式登录(省略了-S/var/lib/mysql/mysql.sock)。
它不用通过网络协议,也可以连接到MySQL的服务器,它需要用到服务器上的一个物理文件(/var/lib/mysql/mysql.sock)。