【问题标题】:Mysql node.js intermittent connectivity issueMysql node.js 间歇性连接问题
【发布时间】:2018-06-11 16:03:47
【问题描述】:

在我的 node.js 应用程序中,我使用 mysql 库进行数据库连接。

当我启动节点服务器时,我可以很好地查询数据库——没问题

当我在 5 分钟后查询数据库时,服务器返回以下错误:

{"code":"PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR","fatal":false}

如果我重新启动我的 node.js 服务器,我可以毫无问题地再次查询...

这是我的代码

const mysql = require('mysql');


let connection = mysql.createPool({
  host: config.mysql.host,
  user: config.mysql.user,
  password: config.mysql.password,
  database: config.mysql.database
});


router.post('/subscription', (req, res) => {
  const user = req.body;
  const q = 'INSERT into Subscription SET ?';
  connection.query(q, user, (err, results) => {
    if (err)
      return res.json(err);
    return res.json(results);
  });
});

我已经使用了 mysql.createConnection 和 mysql.createPool...。还尝试使用 connection.end... 手动结束连接。

两个结果都以相同的错误结尾。

【问题讨论】:

    标签: javascript mysql node.js


    【解决方案1】:

    您需要从池中获取连接并使用它,而不是查询池本身。当您从池中获得连接时,池将确保您从池中获得有效连接。所以你的代码是:

    const mysql = require('mysql');
    
    
    let pool = mysql.createPool({
      host: config.mysql.host,
      user: config.mysql.user,
      password: config.mysql.password,
      database: config.mysql.database
    });
    
    
    router.post('/subscription', (req, res) => {
      const user = req.body;
      const q = 'INSERT into Subscription SET ?';
      pool.getConnection(function(err, connection) {
         if (err)
           return res.json(err);
    
         connection.query(q, user, (err, results) => {
           if (err)
             return res.json(err);
           return res.json(results);
         });
      })
    });
    

    更新

    你不需要单独的pool.getConnection和connection.query,你可以将它们组合成一个pool.query,它会得到一个连接,做查询并释放连接。因此,更新后的代码将是:

    const mysql = require('mysql');
    
    let pool = mysql.createPool({
      host: config.mysql.host,
      user: config.mysql.user,
      password: config.mysql.password,
      database: config.mysql.database
    });
    
    
    router.post('/subscription', (req, res) => {
      const user = req.body;
      const q = 'INSERT into Subscription SET ?';
      pool.query(q, user, function(err, connection) {
         if (err)
           return res.json(err);
    
         return res.json(results);
      });
    });
    

    【讨论】:

    • 我可能应该把 releaseConnection 放在某个地方
    猜你喜欢
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 2014-07-16
    • 2023-02-26
    • 2018-09-17
    相关资源
    最近更新 更多