我用NodeJS构建一个rest api。 它正在使用模块集群,express,body-parser,mssql。 解决方案工作正常,但有时结果是sql错误:服务器关闭了连接。
有人知道解决方案吗?我阅读了有关promise模块的mssql promise的信息,但是我如何实现它,这是一个好的解决方案。
当数据库服务器出现错误时:服务器关闭了我要自动重试的连接(打开SQL DB连接并执行查询)。
var cluster = require('cluster');
if (cluster.isMaster) {
var cpuCount = require('os').cpus().length;
for (var i = 0; i < cpuCount; i += 1) {
cluster.fork();
}
cluster.on('exit', function (worker) {
// Replace the dead worker, we're not sentimental
console.log('Worker %d died:', worker.id);
cluster.fork();
});
} else {
var express = require("express");
var bodyParser = require("body-parser");
var sql = require("mssql");
var app = express();
app.use(bodyParser.json());
app.use(function (req, res, next) {
//Enabling CORS
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, contentType,Content-Type, Accept, Authorization");
next();
});
var server = app.listen(process.env.PORT || 8000, function () {
var port = server.address().port;
console.log("App now running on port", port);
});
var dbConfig = {
user: "<USER>",
password: "<PASSWORD>",
server: "<SERVER>",
database: "<DB>",
connectionTimeout: 999999999,
requestTimeout: 999999999,
pool: {
max: 20,
min: 10,
idleTimeoutMillis: 30000
},
options: {
encrypt: true
}
};
var executeQuery = function(res, query){
sql.connect(dbConfig, function (err, connection) {
if (err) {
console.log("Error while connecting database :- " + err);
res.send(err);
res.end();
}
else {
var request = new sql.Request(connection);
request.query(query, function (err, rs) {
if (err) {
console.log("Error while querying database :- " + err);
res.send(err);
res.end();
}
else {
console.log("Result :- " + rs);
res.send(rs);
res.end();
}
});
sql.close();
}
});
}
app.post("/ic/events/add", function(req , res){
var query = "INSERT INTO EVENT VALUES ('FILE')";
executeQuery (res, query);
});
app.post("/ic/process/to", function(req , res){
var query = "SELECT TOP 1 FROM EVENT WHERE STATUS = 0";
executeQuery (res, query);
});
}
亲切的问候,
标记
答案 0 :(得分:0)
感谢您的帮助。我使用以下代码更改了应用程序以使用1个连接。运行该应用2天后,我不再有任何连接关闭错误。
//Initiallising connection string
var dbConfig = {
user: "",
password: "",
server: "",
database: "",
connectionTimeout: 999999999,
requestTimeout: 999999999,
options: {
encrypt: true
}
};
sql.connect(dbConfig, function (err, connection) {
if (err) {
console.log("Error while connecting database :- " + err);
}
});
var executeQuery = function(res, query, connection){
// create Request object
var request = new sql.Request(connection);
// query to the database
request.query(query, function (err, rs) {
if (err) {
console.log("Error while querying database :- " + err);
res.send(err);
res.end();
}
else {
console.log("Result :- " + rs);
res.send(rs);
res.end();
}
});
};
答案 1 :(得分:-1)
不要为每个执行的查询打开连接。服务器启动时打开与数据库的连接,并在应用程序的生命周期内使用该连接。
Here's an article关于在整个应用程序中共享数据库连接。
现在,如果在查询时随时断开连接,则将错误记录到日志记录系统(Loggly,Rollbar)中,让应用程序死亡,然后让节点监视器重新启动应用程序(Forever,Nodemon)。根据问题所在,发送到日志的错误可能会给您一些答案。很可能是网络错误,无法访问您的数据库。