如何检查数据库连接是否打开?(mysql2 node.js)

j8ag8udp  于 2023-06-29  发布在  Node.js
关注(0)|答案(2)|浏览(180)

亲爱的stackoverflowers:)
我在node.js上做了我的第一个mvc应用程序,遇到了这样一个问题:
有时候,当我很长时间(大约3分钟)没有对数据库进行任何查询,并尝试进行一次查询时,我会出现这样的错误:“此套接字已被对方终结”
我发现,这是因为等待超时选项在mysql配置关闭连接,如果停机时间超过价值
所以我应该在每次查询数据库之前检查连接是否打开,这是正确的吗?如果我应该,怎么做,在哪里?
这是我的数据库连接文件:

const mysql = require('mysql2');

// create the connection to database
const connection = mysql.createConnection({
    host: 'localhost',
    user: 'mysql',
    password: 'mysql',
    database: 'qa'
});

exports.connect = (done) => {
    connection.connect((err) =>{
        if(err){
            console.log('db connection error');
        }
        else{
            done()
        }
   })
}

exports.connection = connection;

这是我的一个模型的一部分:

const db = require('../db');
exports.makeNewQuestion = async (topic, text, subsection, user) => {
    return db.connection.promise().execute("INSERT INTO `questions` (`topic`, `text`, 
    `subsection_id`, `user_id`) VALUES (?, ?, ?, ?)", [topic, text, subsection, user]);
}
piwo6bdm

piwo6bdm1#

据我所知,你不需要一个查询一个现有的表来检查连接/你可以使用这样的东西:

select 1

如果你这样做,你是连接。
通常情况下,您不需要这种方法,除非您需要长期保持连接打开。根据您正在使用的库,您可以收到Promise返回。每次查询数据库时,您可能希望检查promise是否被拒绝,并相应地处理问题。

bjg7j2ky

bjg7j2ky2#

事实证明,在mysql2包中,当连接关闭时,它将变得未定义。所以实际上要弄清楚它们之间是否有联系是很简单的。
这是我目前用来保持一个连接活动的代码:

let dbConnection;

async function getConnection() {
    if (dbConnection === undefined) {
        console.log('Reconnecting to db.');
        dbConnection = await connectDB();
    }
    return dbConnection;
}

因此,您需要做的就是从另一个文件调用getConnection(),它将返回一个现有的连接,或者在连接关闭时返回一个新的连接。

相关问题