我将节点js与mysql一起使用,并且希望避免应用程序在连接错误时崩溃。现在我使用它:
function mysql_handleDisconnect() {
mysql_connection = mysql.createConnection(mysql_config_obj); // Recreate the connection, since
// the old one cannot be reused.
mysql_connection.connect(function(err) { // The server is either down
if(err) { // or restarting (takes a while sometimes).
console.log('error when connecting to db:', err);
mysql_handleDisconnect(); // We introduce a delay before attempting to reconnect,
} // to avoid a hot loop, and to allow our node script to
}); // process asynchronous requests in the meantime.
// If you're also serving http, display a 503 error.
mysql_connection.on('error', function(err) {
console.log('db error', err);
if(err.code === 'PROTOCOL_CONNECTION_LOST') { // Connection to the MySQL server is usually
mysql_handleDisconnect(); // lost due to either server restart, or a
} else { // connnection idle timeout (the wait_timeout
throw err; // server variable configures this)
}
});
}
mysql_handleDisconnect(mysql_connection);
所以这是阻塞因为如果连接关闭会导致热循环。我的问题是,如果我每隔2秒添加一个setTimeout重新建立连接,当我用“mysql_connection”进行查询时,我可能会遇到致命错误.query('SELECT ...')“。在这种情况下,应用程序崩溃。
所以我的问题是,如果在进行查询之前有可能检查连接吗?
答案 0 :(得分:6)
在执行任何操作之前,请尝试在每个微服务中使用以下代码:
if(connection.state === 'disconnected'){
return respond(null, { status: 'fail', message: 'server down'});
}
答案 1 :(得分:2)
每次在生产中推送代码时,mysql连接都会丢失。这是生产中或本地的一个非常普遍的问题。
我的解决方案是,在每个查询中建立数据库连接,并在完成数据库查询后删除连接。
我的解决方案是在每次查询之前建立数据库连接,然后在完成数据库查询后删除连接。
第一步:这是dbConnection.js的代码
//this code is for conenct to db
const mysql = require('mysql2');
require('dotenv').config();
module.exports.stablishedConnection = ()=>{
return new Promise((resolve,reject)=>{
const con = mysql.createConnection( {
host: process.env.DB_HOST||localhost,
user: process.env.DB_USER_NAME||myUserName ,
password: process.env.DB_PASSWORD||mypassword,
database: process.env.DB_NAME||mydb
});
con.connect((err) => {
if(err){
reject(err);
}
resolve(con);
});
})
}
module.exports.closeDbConnection =(con)=> {
con.destroy();
}
Step2:对于Router.js,我要导入数据库连接并处理Promise
const router = require('express').Router();
const {stablishedConnection,closeDbConnection} =require('../db/dbConnection');
router.get('/user/:sId/:userId',function(req,res){
stablishedConnection()
.then((db)=>{
console.log("Db connection stablished");
db.query(`select * from user WHERE sent_id=${req.params.sId} AND user_id=${req.params.userId}`, null, function (err,data) {
if (!data) {
res.status(200).json({sucess:false,err});
}else{
res.status(200).json({sucess:true,data});
closeDbConnection(db);
console.log("Db Connection close Successfully");
}
})
}).catch((error)=>{
console.log("Db not connected successfully",error);
});
});
router.get('/sen/:userId',function(req,res){
stablishedConnection()
.then((db)=>{
console.log("Db connection stablished");
db.query(`select * from sen WHERE user_id=${req.params.userId}`, null, function (err,data) {
if (!data) {
res.status(200).json({sucess:false,err});
}else{
res.status(200).json({sucess:true,data});
closeDbConnection(db);
console.log("Db Connection close Successfully");
}
})
}).catch((error)=>{
console.log("Db not connected successfully",error);
});
});
router.get('/language',(req,res)=>{
stablishedConnection()
.then((db)=>{
console.log("Db connection stablished");
db.query("select * from language", null, function (err,data) {
if (!data) {
res.status(200).json({sucess:false,err});
}else{
res.status(200).json({sucess:true,data});
closeDbConnection(db);
console.log("Db Connection close Successfully")
}
})
}).catch((error)=>{
console.log("Db not connected successfully",error);
});
})
module.exports = router;
如果您想在每个查询中创建并关闭连接,此操作将完美运行。
答案 2 :(得分:1)
我知道这是一个古老的问题,但是我发现connection.ping( (err) => {...})
对于通过负载平衡器进行的健康检查非常有用。