NodeJS Mysql-连接未被释放
2017-10-22
2034
似乎 MySQL 池没有从我的 NodeJS 应用程序释放连接。从 mysql 查看服务器进程时,连接已建立但未释放。
应用程序崩溃并出现以下错误:
TypeError:无法读取未定义的属性“查询”
。据我了解,这是因为我已超出连接限制。
请注意,我正在使用 Heroku MySQL 插件,并且测试连接限制为 10 个。我在 .env DB_URL 末尾添加了 connectionLimit,以尝试限制池中的连接。
在我的 .env 文件中,链接格式如下:
DEV_DB_URL=mysql://user:pass@host:3306/db_name?connectionLimit=5
db.js 文件:
var mysql = require('mysql');
var dbURL = process.env.PRODUCTION === 'true'
? process.env.LIVE_DB_URL
: process.env.DEV_DB_URL;
var dbConnection = function dbConnection( sql, values, next){
// It means that the values hasn't been passed
if (arguments.length === 2){
next = values;
values = null;
}
var pool = mysql.createPool(dbURL);
pool.getConnection(function(err, connection){
connection.query(sql, values, function(err) {
connection.release();
if (err) {
throw err;
}
// Execute the callback
next.apply(this, arguments);
});
});
};
module.exports = dbConnection;
使用 db.js 文件的控制器如下所示:
var DB = require('../services/db');
exports.updateReporting = function(req, res){
var body = req.body;
var sentStatus = body.edc;
if( sentStatus === 'pass'){
res.status(200)
.send({
message: 'EDC is all good.'
})
}
if( sentStatus === 'fail'){
var dateTime = require('node-datetime');
var dt = dateTime.create();
var curTimestamp = dt.format('Y-m-d H:M:S');
var storeId = body.store_id
.substring('Addr1='.length);
var fileTimestamp = body.file_ts;
var data = {
status: sentStatus,
store_id: storeId,
file_ts: fileTimestamp,
current_ts: curTimestamp
};
DB('INSERT INTO edc_reporting SET ?', data, function( err, row ){
if (err) throw err;
});
res.status(200)
.send({
message: 'Message recorded.'
})
}
};
由于我是 Node 新手,我不确定我的
connection.release()
是否在错误的位置并且由于回调而未执行?
任何指示都将不胜感激。
2个回答
这真是一个愚蠢的错误。
在
db.js
文件中,我在导出函数中放入了
var pool = mysql.createPool(dbURL);
inside
;这是错误的。
每次有请求时,都会重新创建连接并启动一个新池。为了解决这个问题,我将池的创建移到了 dbConnection 函数之外,因此,只创建了 1 个池并启动了连接。
BardsWork
2017-10-22
尽管在导出函数之外声明了池并使用 connection.release() 释放连接,但对我来说不起作用。使用 pool.query 代替 connection.query 效果很好,每次都会自动释放连接。
Ankit Bagaria
2020-05-16