db/index.js数据库配置文件

一、在数据库连接失败的情况下,回调函数,再次发起连接,直到连接成功为止。

  1. handleDisconnect(){
  2. this.connection.connect(function(err) {
  3. if(err) {
  4. // console.log('error when connecting to db:', err);
  5. setTimeout(_this.handleDisconnect, 2000);
  6. }
  7. });
  8. this.connection.on('error', function(err) {
  9. if(err.code === 'PROTOCOL_CONNECTION_LOST') {
  10. _this.handleDisconnect();
  11. } else {
  12. throw err;
  13. }
  14. });
  15. }

二、mysql在8个小时内没有任何操作,就会自动中断连接

因此,每个三个小时每个小时ping一次数据库,保持数据库连接状态

  1. clearInterval(pingInterval);
  2. pingInterval = setInterval(() => {
  3. _this.connection.ping((err) => {
  4. if (err) {
  5. console.log('ping error: ' + JSON.stringify(err));
  6. }
  7. });
  8. }, 3600000*3);

三、完整代码如下:

  1. // 加载数据库模块
  2. var mysql = require('mysql');
  3. var _this;
  4. var pingInterval = null;
  5. var db_config = {
  6. host: "host", //主机地址
  7. user: "user", //数据库用户名
  8. password: "password", //数据库用户密码
  9. database: "database" //数据库名
  10. }
  11. class DB{
  12. constructor(){
  13. _this = this;
  14. this.connection = null;
  15. }
  16. handleDisconnect(){
  17. this.connection = mysql.createConnection(db_config);
  18. //数据库连接
  19. this.connection.connect(function(err) {
  20. if(err) {
  21. // console.log('error when connecting to db:', err);
  22. setTimeout(_this.handleDisconnect, 2000);
  23. }
  24. });
  25. this.connection.on('error', function(err) {
  26. if(err.code === 'PROTOCOL_CONNECTION_LOST') {
  27. _this.handleDisconnect();
  28. } else {
  29. throw err;
  30. }
  31. });
  32. // 每个小时ping一次数据库,保持数据库连接状态
  33. clearInterval(pingInterval);
  34. pingInterval = setInterval(() => {
  35. _this.connection.ping((err) => {
  36. if (err) {
  37. console.log('ping error: ' + JSON.stringify(err));
  38. }
  39. });
  40. }, 3600000*3);
  41. return this.connection;
  42. }
  43. }
  44. module.exports = DB;
使用数据库的文件controller/query.js

在开启事务的时候判断数据库连接是否连接错误,

如果连接错误,再次发起连接。

  1. db.beginTransaction((err)=>{
  2. if(err!==null){
  3. db = _this.handleDisconnect();
  4. db.beginTransaction((err)=>{
  5. callback(err)
  6. })
  7. }else{
  8. callback(err)
  9. }
  10. })

完整代码如下:

  1. const DB = require("../../db/index");
  2. const Async = require("async");
  3. var db;
  4. class Query extends DB{
  5. constructor(){
  6. super()
  7. db = this.handleDisconnect()
  8. }
  9. async getList(limit,page,cate,keywords,grade){
  10. return new Promise((resolve, reject) => {
  11. var mydatas = {data:[],total:0};
  12. // ....此处省略业务代码
  13. // 用Async代替嵌套
  14. var task = [
  15. (callback)=>{
  16. // 开启事务
  17. db.beginTransaction((err)=>{
  18. if(err!==null){
  19. db = _this.handleDisconnect();
  20. db.beginTransaction((err)=>{
  21. callback(err)
  22. })
  23. }else{
  24. callback(err)
  25. }
  26. })
  27. },
  28. (callback)=>{
  29. const sql = `...`;
  30. db.query(sql,(err,res)=>{
  31. callback(err);
  32. })
  33. },
  34. (callback)=>{
  35. // 提交事务
  36. db.commit((err)=>callback(err));
  37. }
  38. ];
  39. Async.waterfall(task,(err,res)=>{
  40. if(err){
  41. // 事务回滚
  42. db.rollback();
  43. }else{
  44. resolve(mydatas);
  45. }
  46. })
  47. })
  48. }
  49. }

nodejs连接mysql突然中断问题解决方案的更多相关文章

  1. 转】用Nodejs连接MySQL

    原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/2/ 感谢! 用Nodejs连接MySQL 从零开始node ...

  2. nodejs 连接 mysql 查询事务处理

    自己用 mysql 很多次的,然后又是主玩nodejs的.专门写一篇文章来说说nodejs连接mysql数据库.在使用之前,请检查计算机是否具有一下环境! nodejs 执行环境. mysql数据库环 ...

  3. Nodejs连接mysql

    1.首先需要安装nodejs 的mysql包 npm install mysql 2.编写nodejs与mysql交互的代码 var mysql = require('mysql'); var TES ...

  4. nodejs连接mysql并进行简单的增删查改

    最近在入门nodejs,正好学习到了如何使用nodejs进行数据库的连接,觉得比较重要,便写一下随笔,简单地记录一下 使用在安装好node之后,我们可以使用npm命令,在项目的根目录,安装nodejs ...

  5. nodejs连接mysql实例

    1.在工程目录下运行npm install mysql安装用于nodejs的mysql模块: 2.创建db.js模块用于连接mysql,同时定义query查询方法: var mysql = requi ...

  6. 用Nodejs连接MySQL

    转载,原地址:http://blog.fens.me/nodejs-mysql-intro/ 前言 MySQL是一款常用的开源数据库产品,通常也是免费数据库的首选.查了一下NPM列表,发现Nodejs ...

  7. Nodejs连接mysql的增、删、改、查操作

    一,创建数据库 Source Database : my_news_test SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- ...

  8. nodejs连接mysql数据库,报错Client does not support authentication protocol requested by server的解决方法

    最近想要尝试nodejs连接本地数据库,往全栈方向做一个小小的尝试,于是下载了一个 MySQL8.0,发现Navicat连接不上,结果就下载了mysql自身的Workbench,继续使用. 然而,难受 ...

  9. 使用nodejs连接mysql数据库实现增删改查

      首先要有数据库 使用xampp 或者 phpstudy 可以傻瓜式安装 新建一个项目文件夹 之后在这个目录下初始化package.json (npm init) 先在项目中安装mysql 和 ex ...

随机推荐

  1. 清空/var/adm/wtmp 文件内容

    清/var/adm/wtmp 文件内容 用于显示登录系统和重启机器的情况 /var/adm/wtmp文件过大. 可用du -sm /var/adm/wtmp查看 cat /dev/null>/v ...

  2. Linux桌面词典 GoldenDict词典

    GoldenDict 是一款不错的.与StarDict(星际译王)类似的词典软件.它使用 WebKit作为渲染核心,格式化.颜色.图像.链接等支持一应俱全:支持多种词典文件格式,包括Babylon的 ...

  3. python学习二,字符串常用操作

    字符串可以说是在日常开发中应用最广泛的了,现在来总结下有关python中有关字符串一些常用操作 首先我们声明一个字符串变量 str = "hello world" 下面我们来依次介 ...

  4. 推荐《机器学习实战:基于Scikit-Learn和TensorFlow》高清中英文PDF+源代码

    探索机器学习,使用Scikit-Learn全程跟踪一个机器学习项目的例子:探索各种训练模型:使用TensorFlow库构建和训练神经网络,深入神经网络架构,包括卷积神经网络.循环神经网络和深度强化学习 ...

  5. 03014_properties配置文件

    1.使用properties配置文件 (1)开发中获得连接的4个参数(驱动.URL.用户名.密码)通常都存在配置文件中,方便后期维护,程序如果需要更换数据库,只需要修改配置文件即可: (2)通常情况下 ...

  6. GPU和CPU的区别

    http://blog.csdn.net/conowen/article/details/7256260 这里有几种计算平台的Flynn分类法 GPU是SIMD 多核CPU是MIMD 硬件结果多核处理 ...

  7. 学一下gconv, gprof等知识

    scons.gcc.gdb.valgrind.gcov SCons 是一个用 Python 语言编写的类似于 make 工具的程序.与 make 工具相比较,SCons 的配置文件更加简单清晰明了. ...

  8. c/c++中static与extern关键字介绍

    一.C语言中的static关键字 在C语言中,static可以用来修饰局部变量,全局变量以及函数.在不同的情况下static的作用不尽相同. (1)修饰局部变量 一般情况下,对于局部变量是存放在栈区的 ...

  9. Hive里的分区、分桶、视图和索引再谈

    福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑         Java全栈大联盟   ...

  10. 游标 scroll

    scroll表示可随意移动游标指针(否则只能向前)