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

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实现连接池。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468447.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何解决Binder泄漏问题

作者:王小二C 2019/09/06前言[011]一个看似是系统问题的应用问题的解决过程[1]中我们解决了一个注册过多的BroadcastReceiver导致的某一次发送广播失败的问题。我这边遇到了一个类似的问题,但是我用了一个可能网络上从来没有提出过的方法,解…

Docker-compose实战——Django+PostgreSQL

今天我们来用docker-compose 快速安装一个DjangoPostgreSQL的开发环境。 Compose简介 Compose 定位是“defining and running complex applications with Docker”,前身是 Fig,兼容 Fig 的模板文件。 Dockerfile 可以让用户管理一个单独的应用容器&#…

终于赢球了

感谢老将易建联我们要承认一个事实,阿联是这届男篮里面的老将,是唯一一个80后球员,很多人不了解老将意味着什么,很多打篮球的人都有一个感觉,在高中时代的时候,打球的时候经常在天上飞来飞去不觉得累&#…

linux下mysql主从同步是主从i/o线程显示为no_mysql主从同步IO线程NO

主从同步错误一例mysql> show slavestatus\G;***************************1. row ***************************Slave_IO_State:Master_Host: 10.0.10.114Master_User: repMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000024Read_Master_Log_Pos: 264Rela…

Zookeeper原理和实战开发经典视频教程 百度云网盘下载

Zookeeper原理和实战开发 经典视频教程 百度云网盘下载 资源下载地址:http://pan.baidu.com/s/1o7ZjPeM 密码:r5yf 转载于:https://www.cnblogs.com/heitaok/p/6979781.html

C语言大神进来看看这个题目

之前一个读者给我发的一个题目,我大概看了下,题目的难度还是比较大的,而且考察的内容也比较多,可能在实际项目上使用比较少,估计十几年的老码农都没有用过,但是在看大神的代码的时候,就特别考验…

qq浏览器主页_安卓浏览器哪家强?这些小众好用的手机浏览器你知道吗

前言无论手机还是电脑,浏览器都可以说是最重要的软件之一了。最流行的 Chrome 和 Firefox,国内常见的还有 UC、QQ、360 浏览器等。手机上可供选择的优秀浏览器还有很多,这次就推荐些其他的小众但是也很好用的安卓手机浏览器。安卓手机浏览器推…

ms access to mysql_Access转MySQL工具

Bullzip MS Access To MySQL是一个Access转MySQL工具,可以帮助用户把MS Access数据库中的内容转到MySQL数据库中,支持全部转换以及有选择的转换,支持命令行,非常适合有Access转MySQL需求的数据库维护人员使用。Bullzip MS Access …

_一文让你透彻理解Linux的SOCKET编程(含实例解析)

1. 网络中进程之间如何通信进 程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如UNIX BSD有:管道(…

老师好

今天是教师节,今年楠哥也上幼儿园了,以后估计会经常跟老师有接触,我楼上的一个邻居,叫老莫,跟我的关系很好,有钱,又有儿有女,大女儿现在已经上小学了,每天上班的时候&…

Bootstrap全局CSS样式之表单

.form-control——将单独的表单控件赋予一些全局样式,如默认宽度width:100%。 .form-group——包裹表单控件,获得最好的排列; .form-inline——将表单设置为内联表单,仅仅适用于视口(viewport)至少在 768px…

mysql索引使增删变慢_mysql优化(四)–索引

http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html一、 四种索引类型:主键索引,唯一索引,全文索引,普通索引二、 为什么建立索引比较快一般的数据表是按照行来存储的,字段多、有长字段的表的记录就会长…

Linux 下的推迟执行

准备中秋节说个活动,评论文章点赞排名,用心评论哦,前5名获得每人 19 心意红包。感谢大家的支持我最近在用freertos,想让一个任务在某个时间后再执行,找了一圈,竟然没有这样才处理机制,因为也是新…

ASP.NET系统退出(移除Session 、清除浏览器缓存)

一、在退出时移除Session,首先在登录时要记录登录信息 Session["id"] user.id.ToString();Session["name"] user.name.ToString();Session["pwd"] user.password.ToString();Session["time"] user.LoginTime.ToString(…

js 获得明天0点时间戳_js实现一个简单钟表动画(javascript+html5 canvas)

自己学生时代的代码,发现还保存着,今天拿出来分享下。用js和html5 canvas对象实现一个简单钟表程序主要用到的就是h5的canvas对象canvas对象本人也不是很熟,大致看了几个常用的方法,难免有不足之处,仅是练习所用。实现…

mysql 根据当前时间戳_mysql timestamp类型 根据当前时间戳更新

注意到这个是因为一次事故。一个简单的操作记录表,只记录了一个操作人,操作时间,操作结果。当时为了演示效果,在生产环境中去修改,创建数据。一顿操作猛如虎之后发现,所有改过的数据的创建时间都变成了当前…

设置拖拽事件,获取拖拽内容

设置dragEnter 设置DragDrop using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using…

笔记本电脑锁_2020年双11有哪些值得选购的笔记本电脑?(全能本/便携高性能笔记本电脑/设计本)...

(本文于2020年10月22日更新)本文章会不定期更新,保证文章的时效性和准确性,可点赞或收藏本文章,这样在需要的时候可以找到啦。文章推荐产品较多,按价位排序,篇幅较长,可按键盘CtrlF快…

android libc 有哪些函数_Android scudo功能介绍

一 简述前面介绍了malloc_debug功能,用来进行内存泄露等检测,其实android可以使用多种方法进行内存相关的监控。比如利用llvm功能再编译时添加内存的相关检测。Android R默认开启了scudo。scudo这个选项主要功能是再分配内存时会添加64 bit的Header// Ou…

300来行代码实现最小Linux文件系统

Linux作为一个类UNIX系统,其文件系统保留了原始UNIX文件系统的表象形式,它看起来是这个样子:rootname-VirtualBox:/# lsbin boot cdrom dev etc home lib lib64 lostfound media mnt opt proc root run sbin snap srv sys …