MySQL长连接

MySQL短连接每次请求操作数据库都需要建立与MySQL服务器建立TCP连接,这是需要时间开销的。TCP连接需要3次网络通信。这样就增加了一定的延时和额外的IO消耗。请求结束后会关闭MySQL连接,还会发生3/4次网络通信。

close操作不会增加响应延时,原因是close后是由操作系统自动进行通信的,应用程序感知不到

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

断线重连

在cli环境下,PHP程序需要长时间运行,客户端与MySQL服务器之间的TCP连接是不稳定的。

MySQL-Server会在一定时间内自动切断连接

PHP程序遇到空闲期时长时间没有MySQL查询,MySQL-Server也会切断连接回收资源

其他情况,在MySQL服务器中执行kill process杀掉某个连接,MySQL服务器重启

这时PHP程序中的MySQL连接就失效了。如果仍然执行mysql_query,就会报一个“MySQL server has gone away”的错误。程序处理不到就直接遇到致命错误并退出了。所以PHP程序中需要断线重连。

有很多人提出了mysql_ping的方案,每次mysql_query进行连接检测或者定时连接检测。这个方案不是最好的。原因是

mysql_ping需要主动侦测连接,带来了额外的消耗

定时执行mysql_ping不能解决问题,如刚刚执行过mysql_ping检测之后,连接就关闭了

最佳的方案是进行断线重连 。它的原理是:

(SwooleCoroutineMysql和PDO等其他客户端同理, 此处简单举例)

mysql_query执行后检测返回值

如果mysql_query返回失败,检测错误码发现为2006/2013(这2个错误表示连接失败),再执行一次mysql_connect

执行mysql_connect后,重新执行mysql_query,这时必然会成功,因为已经重新建立了连接

如果mysql_query返回成功,那么连接是有效的,这是一次正常的调用

MySQL异步

MySQL异步是指将MySQL连接事件驱动化,这样就变成了非阻塞IO。数据库操作并不会阻塞进程,在MySQL-Server返回结果时再执行对应的逻辑。

有几个点需要注意一下:

异步MySQL并没有节省SQL执行的时间

一个MySQL连接同时只能执行1个SQL,如果异步MySQL存在并发那么必须创建多个MySQL连接

异步回调程序中,异步MySQL并没有提升性能。异步最大的好处是可以高并发,如果并发1万个请求,那么就需要建立1万个MySQL连接,这会给MySQL-Server带来巨大的压力。

MySQL是根据连接数分配资源的,一个连接需要开启一个线程。1000连接那么需要维持1000线程才可以。线程数量增加后,线程间切换会占用大量CPU资源

MySQL短连接反而不会出现此问题,因为短连接在使用完后就释放了。不会占用MySQL-Server的连接资源

虽然应用层代码使用异步回调避免了自身的阻塞,实际上真正的瓶颈是数据库服务器。异步MySQL还带来了额外的编程复杂度,所以除非是特殊场景的需求,否则不建议使用异步MySQL。

如果程序中坚持要使用异步,那么必须是异步MySQL+连接池的形式。超过规定的MySQL最大连接后,应当对SQL请求进行排队,而不是创建新连接,避免大量并发请求导致MySQL服务器崩溃。

MySQL连接池

连接池是可以有效降低MySQL-Server负载的。原理是 连接池使用一个共享资源的模式,如并发100个请求,实际上并不是每个请求的所有时间都在执行SQL查询。这样100个请求,共享20个MySQL连接就可以满足需求了。当一个请求操作完数据库后,开始进入模板渲染等流程,这时就会释放数据库连接给其他的请求使用。

连接池仅在超大型应用中才有价值。普通的应用采用MySQL长连接方案,每个php-fpm创建一个MySQL连接,每台机器开启100个php-fpm进程。如果有10台机器,每台机器并发的请求为100。实际上只需要创建1000个MySQL连接就能满足需求,数据库的压力并不大。即使有100台机器,硬件配置好的存储服务器依然可以承受。

达到数百或者数千台应用服务器时,MySQL服务器就需要维持十万级的连接。这时数据库的压力就会非常大了。连接池技术就可以派上用场了,可以大大降低数据库连接数。

同步阻塞模式

可基于swoole的AsyncTask模块实现的连接池,编程简单,没有数据同步和锁的问题。甚至可以多个服务共享连接池。缺点是: 1. 灵活性不如多线程连接池,无法动态增减连接 2. 有一次进程间通信的开销

协程模式

可使用channel实现连接池。

golang mysql断线_MySQL的连接池、异步、断线重连-Go语言中文社区相关推荐

  1. .tar.gz mysql 安装_mysql tar.gz 版本 linux系统的安装-Go语言中文社区

    mysql下载地址: https://dev.mysql.com/downloads/mysql/ 1.  上传下载的tar.gz文件发送到linux 上传的路径: /usr/local/mysql/ ...

  2. MySQL非分片字段查询_Mycat从入门到放弃-Go语言中文社区

    当初写这篇文章的初衷只是想提醒自己在用一个开源产品前不仅要了解其提供的功能,更要了解其功能和场景边界. 1.非分片字段查询 Mycat中的路由结果是通过分片字段和分片方法来确定的.例如下图中的一个My ...

  3. 微服务 mysql 连接池_【mysql】druid,连接池和微服务的问题

    我所知道的 druid 配置,是在一个服务上进行配置 假如一台机器上装有 mysql 当我们用连接池去连接的时候 根据 https://blog.csdn.net/w059805- 说法 连接池的大小 ...

  4. mysql多个字符串连接池_使用Coroutine\Channel实现一个简单的MySQL连接池

    Channel通道,类似于go语言的chan,支持多生产者协程和多消费者协程,Swoole底层自动实现了协程的切换和调度 Channel实现原理 通道与PHP的Array类似,仅占用内存,没有其他额外 ...

  5. dbcp连接池配置详解_重学MySQL:事务与连接池,一文详解带你搞懂

    拼多多三面惨败,java中间件.数据库与spring框架,答不上... 吊打MySQL:21性能优化实践+学习导图+55面试+笔记+20高频知识点 Mysql事务 事务: 事务指逻辑上的一组操作,组成 ...

  6. mysql c api简单连接池

    连接池为了解决频繁的创建.销毁所带来的系统开销. 简而言之,就是 自己先创建一定量的连接,然后在需要的时候取出一条连接使用. 当然如果你只有一个线程连接数据库,而且不是实时返回结果,那么你完全不必用连 ...

  7. spring-boot配置MySQL数据库连接、Hikari连接池、和Mybatis的简单方法

    此方法为极简配置,支持MySQL数据库多库连接.支持Hikari连接池.支持MyBatis(包括Dao类和xml文件位置的配置). 如果需要更灵活的自定义配置(比如支持分页插件),请参考:http:/ ...

  8. go连接mysql集群_Mysql集群方案-Go语言中文社区

    MySql集群原理 比如有三台mysql,当java使用数据源连接池进行连接的时候,应该连接哪台呢?其实连接哪台都不行,万一你连接的mysql,突然宕机了,那么数据都查询不到了,其实应该连接mycat ...

  9. mysql 等待时间_mysql设置连接等待时间(wait_timeout)

    Linux下mysql修改连接超时 1,首先进入mysql,查看 wait_timeout.interactive_timeout这个值是否为默认的8小时(即 28800) [root@server1 ...

最新文章

  1. c#分布式ID生成器
  2. C++Pigeonhole sort鸽巢排序的实现算法(附完整源码)
  3. 【转】带你玩转Visual Studio——01.开篇介绍
  4. arm9重启ssh服务_部署ssh使用rsa登录配置
  5. 倾心家教安卓案例开发代码_开发一个APP多少钱?
  6. 利用dex2jar反编译apk
  7. MPLS(多协议标记交换)协议能否降低跨省组建企业专网的成本?
  8. 求完全二叉树结点个数(leetcode 222)
  9. Mybatis 一对多
  10. 一年级下册健康教育教案
  11. Charles抓包微信小程序数据
  12. 2022电大国家开放大学网上形考任务-健康评估非免费(非答案)
  13. Linux之用户和组账户管理命令
  14. 暴雪和黑客的战争四:暴雪的杀手锏-The Warden
  15. 课堂笔记(常用软件,网站资源)
  16. 自定义view系列---刮刮乐的实现
  17. 正则表达式的基本语法规则
  18. 个人看法(设计思想)
  19. 关于调用阿里大鱼发送手机验证码短信同一账号发送多次后失败
  20. MIUI10设置Android通知,Miui10状态栏美化修改工具

热门文章

  1. Cisco无线AP的配置
  2. 网管日志-06.07.25
  3. 股票代码前面为0,补齐6位数
  4. LIMIT M,N分页性能优化方案
  5. JAVA如何取得空list成员类型_String 类型的List作为一个成员变量保存,保存成功后取对象时报空指针...
  6. 力扣交替打印FooBar
  7. #Pragma Pack(n)与内存分配 pragma pack(push,1)与#pragma pack(1)的区别
  8. C# DataTable的詳細用法
  9. MS CRM 2011 RC中的新特性(9)—全新的工作流 脚本设计模式
  10. 使用webpack配置react并添加到flask应用