NODEJS EXPRESS приложение падает из-за дисконекта к БД
Падает приложение на сервере, запускают с помощью PM2. Может работать иногда день, два, иногда каждый день крашится. Выводил в лог память, в среднем от 100 до 400мб жрет на VDS 8gb. В логах причина - дисконект с мускулем. Есть предположение что неправильно организую работу с базой. Соединение нигде не завершаю с помощью .end() метода, файл работы с бд прикладываю. Нагрузка на сервер нулевая, нет запросов. Только тестовые от меня. Может быть из-за того, что не трогаю - по времени истечения база разрывает соединение? Значит должно как-то делаться переподключение? Что тогда в коде не так?( Помогите пожалуйста..
const config = require('../config.json');
const mysql = require('mysql2');
const pool = mysql.createPool({
connectionLimit : 20,
host : config.db.host,
user : config.db.user,
password : config.db.password,
database : config.db.dbname,
debug : false,
port : config.db.port,
charset : "utf8mb4"
});
module.exports.query = function(query, params, callback) {
pool.getConnection(function(err, connection) {
if (err) throw err;
connection.query(query, params, function(err, rows) {
connection.release();
if (!err) {
callback(null, {rows});
}
});
connection.on('error', function(err) {
throw err;
});
});
};
module.exports.pool = pool;
Ответы (1 шт):
В общем накидал некоторый примерщик, как вообще это было-бы красиво и работоспособно.
Ты кидаешь throw err и он улетает прямо в верхний стек. который без сatch конечно грохает программу. Золотое правило программирования! Все exceptions должны быть пойманы! Именно по той-же причине в Java нельзя сделать throw без обработчика catch.
const mysql = require("mysql2");
const express = require("express");
const pool = mysql.createPool(require("./config").db);
const app = express();
app.use((req, res, next) => {
pool.getConnection((err, connection) => {
if (err) {
console.error(err);
res.end("We have database connection problems, sorry");
return;
}
res.on("finish", () => {
connection.release();
});
connection.on("error", (err) => {
console.error(err);
res.end("We have database connection problems, sorry");
});
req.dbquery = function(query, params) {
return new Promise((resolve, reject) => {
connection.query(query, params, (err, rows) => {
if (err) {
console.error(err);
reject(err);
return;
}
resolve(rows);
});
});
}
next();
});
});
app.get("/", async (req, res) => {
try {
let tables = await req.dbquery("SELECT * FROM `TABLES` WHERE `TABLE_SCHEMA` = ?", ["information_schema"]);
res.json(tables);
} catch (err) {
res.end("error page");
}
})
main().catch(console.error);
async function main() {
app.listen(8080);
}