关于node mysql 链接数据库问题?
发布于 5 年前 作者 fengjiahao 2447 次浏览 来自 问答

场景

本人用三种方式链接数据库:

  • 第一种:使用.connect() .end()。连续请求,第一次可以,后面就时好时坏
  • 第二种:不使用 .connect() .end()。连续请求,所有请求正常,参考 文档中有句话However, a connection can also be implicitly established(隐式链接) by invoking a query. 为啥隐式链接就ok?
  • 第三种:使用链接池 mysql.createPool()。连续请求,所有请求正常

查了各种资料,在GitHub上也遇到了同样的这个问题, issues 虽然知道用连接池和隐式链接就ok,但是还想搞清楚。并且如何用第一种使用.connect() .end()达到连续请求而不报错

var mysql      = require('mysql');
// 第一种 使用 .connect() .end()
var connection = mysql.createConnection({
 // 各种设置
})
...
connection.connect()
connection.query(sql, function (error, results, fields) {
 // 查询后处理的代码
})
connection.end()
...

// 第二种 不使用 .connect() .end()
var connection = mysql.createConnection({
 // 各种设置
})
...
connection.query(sql, function (error, results, fields) {
 // 查询后处理的代码
})
...

// 第三种 使用链接池
var pool = mysql.createPool({
 // 各种设置
})
...
pool.getConnection(function (err, connection) {
  connection.query(sql, function (error, results, fields) {
    connection.release();
    // 查询后处理的代码
  })
});
...

5 回复

从性能上考虑建议用连接池 至于你说的第一种情况说只有第一次正常后面时好时坏,你也没说具体是怎么个坏法,没法给你看 不过多半应该是你的前一次query还没release的时候就就行了第二次query 因为2,3都会自动创建或者从pool里拿取可用的连接

@im-here 第一种情况时好时坏

  • connection.connect()的报错Error: Cannot enqueue Handshake after invoking quit
  • connection.query()的报错PROTOCOL_ENQUEUE_AFTER_QUIT Error: Cannot enqueue Query after invoking quit.
  • F12调试 Network中有时候(failed) net::ERR_EMPTY_RESPONSE 或者 (failed) net::ERR_CONNECTION_REFUSED

如何在query中release? 大家都是用链接池的吗?

@fengjiahao 从你贴的前面2个错误来看 应该就是我说的前一次query还没release,这里的release就是你上面代码里的onnection.end(),你两次的查询间隔应该很短吧? 至于第三条错误应该由于网络或者什么原因从数据里创建连接的时候失败了

同我第一条回复,从性能方面考虑,建议使用连接池。 至于连接池的作用去补一下数据库方面的知识吧

回到顶部