当前位置: 首页 > news >正文

nodejs mysql 断线重连_nodejs中mysql断线重连

之前写了个小程序Node News,用到了MySQL数据库,在本地测试均没神马问题。放上服务器运行一段时间后,偶然发现打开页面的时候页面一直处于等待状态,直到Nginx返回超时错误。于是上服务器检查了遍,发现程序仍然在运行,且能正确记录每次的请求,再修改代码跟踪调试,原来是在查询数据库的时候,回调一直没有被执行,程序就挂在那里了。

想了很久也想不明白为神马mysql模块没有执行回调,最后突然想起来去看了下错误日志,才发现有个“No reconnection after connection lost”错误没有被捕捉到,原来是连接丢失了,上github上看了下文档和issues,上面说到连接丢失后不会自动重新连接,会触发error事件。我赶紧给程序添加了断线后自动重连功能,现在已正常运行了10多天。

MySQL中有一个名叫wait_timeout的变量,表示操作超时时间,当连接超过一定时间没有活动后,会自动关闭该连接,这个值默认为28800(即8小时)。

自动重连数据库的代码:

functionhandleError (err){if(err){// 如果是连接断开,自动重新连接if(err.code ==='PROTOCOL_CONNECTION_LOST'){connect();}else{console.error(err.stack ||err);}}}// 连接数据库functionconnect (){db =mysql.createConnection(config);db.connect(handleError);db.on('error',handleError);}vardb;connect();

网上流传的大多数使用mysql模块的代码,往往忽略了这个问题,一不小心就让一拨又一拨的人往坑里踩了。

有童鞋回复问使用pool又会怎样,于是去看了下mysql模块的源码:目前可在npm中安装到的最新版本为2.0.0-alpha7,使用mysql.createPool()来创建的pool没办法自动处理连接被关闭的问题,但是在github上的版本已经修复了(应该还没发布到npm上),当触发了connection的error事件时,会把该connection对象从连接池中移除。(源码:https://github.com/felixge/node-mysql/blob/master/lib/Pool.js#L119 )

使用pool的代码:

varmysql =require('mysql');varpool =mysql.createPool(config);pool.getConnection(function(err,connection){// Use the connectionconnection.query('SELECT something FROM sometable',function(err,rows){// And done with the connection.connection.end();// Don't use the connection here, it has been returned to the pool.});});

相关文章:

  • mac mysql.tar.gz_mac 安装 mysql.tar.gz
  • debian 编译mysql源码_debian 下编译mysql源码出错【求助】
  • python linspace函数_c语言中的python linspace++
  • 因为左侧和右侧的元素数目不同。_求数组中第K大的元素
  • mysql查询优化非索引_mysql 查询优化和索引使用心得
  • mysql ab复制延时_MySQL AB复制详述
  • Java将MySQL数据写入json_Java实现将json中的数值插入到mysql中
  • mysql部署模型_proxysql-单主模型MGR部署
  • python 报表打印预览_python学习笔记之wxpython打印预览
  • python动态规划算法最大k乘积_动态规划最大K乘积问题
  • python实现语音播放失败_PyAudio alsa错误消息
  • python更新pip管理员权限_PIP升级权限被拒绝Windows 10
  • redis监听mysql数据库数据_天兔监控服务器和mysql,redis等监控
  • 第二部分 Mysql数据库管理_第二篇 数据库MySql
  • mysql 从库基于主库binlog恢复_MySQL利用binlog来恢复数据库
  • @angular/forms 源码解析之双向绑定
  • 11111111
  • es的写入过程
  • Hibernate最全面试题
  • Javascript Math对象和Date对象常用方法详解
  • js继承的实现方法
  • k8s 面向应用开发者的基础命令
  • ReactNativeweexDeviceOne对比
  • Redis 懒删除(lazy free)简史
  • spring security oauth2 password授权模式
  • Vue.js 移动端适配之 vw 解决方案
  • 实战|智能家居行业移动应用性能分析
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 线性表及其算法(java实现)
  • 最简单的无缝轮播
  • 仓管云——企业云erp功能有哪些?
  • # Java NIO(一)FileChannel
  • #Z0458. 树的中心2
  • #数学建模# 线性规划问题的Matlab求解
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (附源码)ssm高校实验室 毕业设计 800008
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)linux下的时间函数使用
  • (转)程序员技术练级攻略
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .java 9 找不到符号_java找不到符号
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET DataGridView数据绑定说明
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET 中让 Task 支持带超时的异步等待
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .net和php怎么连接,php和apache之间如何连接
  • .NET中使用Redis (二)
  • @AutoConfigurationPackage的使用
  • [android] 练习PopupWindow实现对话框
  • [Contest20180313]灵大会议
  • [Deep Learning] 神经网络基础