使用mysql的长连接

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介:   有个资料看得我云里雾里的。现在用自己的言语来总结一下,写文字,能够加深自己的理解。也会在写的过程中帮助自己发现理解方面瑕疵,继续查资料求证。     短链接的缺点:创建一个连接,程序执行完毕后,就会自动断掉与mysqlserver的链接。

 

 

有个资料看得我云里雾里的。现在用自己的言语来总结一下,写文字,能够加深自己的理解。也会在写的过程中帮助自己发现理解方面瑕疵,继续查资料求证。

 

 

短链接的缺点:创建一个连接,程序执行完毕后,就会自动断掉与mysqlserver的链接。于是多少次php执行,就会多少次这样的创建和释放过程。频繁地创建和释放连接,比较耗费cpu资源。

 

长连接就可以避免每次请求都创建连接的开销,节省了时间和IO消耗。

 

长连接是提高了性能。不过还有一些细节的问题需要解决,即mysql发现一个链接长时间没有执行查询请求,就会自动断掉这个连接。

 

具体多长时间后断掉,有个timeout设置时间。通过sql:"show global variables like '%timeout';" 查看。

 

my.conf中的

wait_timeout=2880000
interactive_timeout = 2880000

 

当链接已经失效了,仍然去执行查询操作,一个明显的表现形式就是提示:MySQL server has gone away

 

启发:MySQL server has gone away这个信息是mysql服务器提示出来的呢?还是php的mysql扩展提示出来的呢?

 

据判断,肯定是应用程序服务器报出来的(php)。想一想,如果mysql都已经接到请求了,那么还出现什么链接不上。明明都已经链接上了。

 

既然mysql服务器都能够接受请求,那么还怎么处理不过来呢。

 

我们去百度搜索:MySQL server has gone away。从来没有看到java链接mysql出现这样的情况。如果是mysql 服务器报出来的。那么应该与应用程序无关。所以应该也会搜索到相关信息的。

据此判断,这是php抛出来的信息。php链接不上mysql了。

 

 

 

 

 

http://ronaldbradford.com/blog/sqlstatehy000-general-error-2006-mysql-server-has-gone-away-2013-01-02/

 

使用mysql_ping()函数能够检测与mysql服务器是不是链接状态。避免出现MySQL server has gone away。

 

每次执行查询前,先使用mysql_ping()去检测一下连接有没有断掉。如果断掉了。重新建立一次链接。

具体代码为:

 

if(mysql_ping()!=0){

 //链接已经断开,需要重新建立链接

    $this->conn = mysql_connect($ip,$user_name,$password);

}

 

小缺点是:每次都要去检测执行mysql_ping(),耗费资源。

 

一种改进办法是:根据mysql_query()的返回错误码来决定是不是要重新链接

 

$res = mysql_query($sql, $this->conn);

       

if($res===false){

 if(mysql_errno($this->conn)==2006 || mysql_errno($this->conn)==2003){

    //去检测一下与mysql服务器的链接是不是有效

    if(mysql_ping()!=0){

       //重新建立链接

 

   }

}

}

 

备注:

  2003对应的错误信息是,Can't connect to MySQL

 

2006 对应的错误信息是 MySQL server has gone away


思考:真正意义上自己实现的连接池,是长期与数据库服务器链接起链接的。如何建立起链接呢。就是定期发送心跳包。通过心跳包与服务器进行通信。

如果没有发送心跳包,则会被数据库服务器断掉这个链接。因为长时间没有通信的链接,要断掉。


待完善


MYSQL has gone away的解释:

http://database.51cto.com/art/201105/261107.htm
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
9月前
|
关系型数据库 MySQL Java
【面试题精讲】MySQL-长连接和短连接
【面试题精讲】MySQL-长连接和短连接
|
关系型数据库 MySQL PHP
《MySQL DBA修炼之道》——1.5 长连接、短连接、连接池
本节书摘来自华章出版社《MySQL DBA修炼之道》一书中的第1章,第1.5节,作者:陈晓勇,更多章节内容可以访问云栖社区“华章计算机”公众号查看。 1.5 长连接、短连接、连接池 当数据库服务器和客户端位于不同的主机时,就需要建立网络连接来进行通信。
2690 0
|
6天前
|
存储 关系型数据库 MySQL
探索MySQL:关系型数据库的基石
MySQL,作为全球最流行的开源关系型数据库管理系统(RDBMS)之一,广泛应用于各种Web应用、企业级应用和数据仓库中
|
4天前
|
关系型数据库 MySQL 网络安全
Mysql 数据库主从复制
在MySQL主从复制环境中,配置了两台虚拟机:主VM拥有IP1,从VM有IP2。主VM的`my.cnf`设置server-id为1,启用二进制日志;从VM设置server-id为2,开启GTID模式。通过`find`命令查找配置文件,编辑`my.cnf`,在主服务器上创建复制用户,记录二进制日志信息,然后锁定表并备份数据。备份文件通过SCP传输到从服务器,恢复数据并配置复制源,启动复制。检查复制状态确认运行正常。最后解锁表,完成主从同步,新用户在从库中自动更新。
862 6
Mysql 数据库主从复制
|
4天前
|
缓存 运维 关系型数据库
数据库容灾 | MySQL MGR与阿里云PolarDB-X Paxos的深度对比
经过深入的技术剖析与性能对比,PolarDB-X DN凭借其自研的X-Paxos协议和一系列优化设计,在性能、正确性、可用性及资源开销等方面展现出对MySQL MGR的多项优势,但MGR在MySQL生态体系内也占据重要地位,但需要考虑备库宕机抖动、跨机房容灾性能波动、稳定性等各种情况,因此如果想用好MGR,必须配备专业的技术和运维团队的支持。 在面对大规模、高并发、高可用性需求时,PolarDB-X存储引擎以其独特的技术优势和优异的性能表现,相比于MGR在开箱即用的场景下,PolarDB-X基于DN的集中式(标准版)在功能和性能都做到了很好的平衡,成为了极具竞争力的数据库解决方案。
|
10天前
|
XML Java 关系型数据库
Action:Consider the following: If you want an embedde ,springBoot配置数据库,补全springBoot的xml和mysql配置信息就好了
Action:Consider the following: If you want an embedde ,springBoot配置数据库,补全springBoot的xml和mysql配置信息就好了
|
9天前
|
关系型数据库 MySQL 数据库
关系型数据库mysql数据增量恢复
【7月更文挑战第3天】
123 2
|
9天前
|
关系型数据库 MySQL Shell
关系型数据库mysql数据完全恢复
【7月更文挑战第3天】
82 2
|
9天前
|
存储 关系型数据库 MySQL
|
10天前
|
存储 关系型数据库 MySQL