2

我正在为我的 nodejs 应用程序使用 oracle 数据库。

更改任何表时,我得到错误资源已经在使用

出现此错误是因为在终止或退出 nodejs 应用程序时,数据库连接没有被释放或关闭。

我知道如何释放数据库连接

function doRelease() {
    db.close(
        function (err) {
            if (err)
                console.error(err.message);
        });
}

但我不知道,如何在 nodejs 退出或节点终止时调用上述函数?

所以我想要简单的帮助

退出或终止nodejs应用程序时如何释放数据库连接

任何帮助将不胜感激

4

4 回答 4

1

关于 nodejs 退出的类似问题在链接中

       function doRelease() {
            db.close(
                function (err) {
                    if (err)
                        console.error(err.message);
                });
            console.log(`db released successfully`)
        }
        function killProcess() {
            if (process.exitTimeoutId) {
                return;
            }
            process.exitTimeoutId = setTimeout(process.exit, doRelease());
        }
        process.on('SIGTERM', killProcess);
        process.on('SIGINT', killProcess);
        process.on('uncaughtException', function (e) {
            console.log('[uncaughtException] app will be terminated: ', e.stack);
            killProcess();
        });
        console.log('Try to press CTRL+C or SIGNAL the process with PID: ', process.pid);
        process.stdin.resume();

上面的代码对我有用

于 2018-06-05T06:18:37.747 回答
0
var mysql = require('mysql');
var pool  = mysql.createPool({
  connectionLimit : XX,
  host            : 'yourHost',
  user            : 'user',
  password        : 'password'
});

pool.getConnection(function(err, connection,) {
    connection.query( 'SELECT something FROM sometable', function(err, rows) {

//handler
      connection.release();//this is the important step

   });
});

或者,您可以使用: .query

pool.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
  if (err) throw err;

  //your success handler
});

pool.query()pool.getConnection()++的connection.query()快捷方式connection.release()

如果您正在查看退出处理程序的内容:

function graceExitHandler(){
// close the db connection here.
..
} 

//when nodejs app is closing
process.on('exit', exitHandler);

//on Ctrl + C interrupt
process.on('SIGINT', exitHandler);
于 2018-06-05T05:46:55.050 回答
0

initialize简单的解决方案是使用和之类的方法创建一个数据库模块close。然后你需要在正确的时间调用这些方法。我喜欢将它们与主模块中的各种事件联系起来。

请查看我关于使用 Node.js 和 Oracle 数据库创建 REST API系列的第 1 部分和第 2 部分以获得想法。

于 2018-06-05T13:17:44.910 回答
0

您可以捕获用于 ctrl+c 事件的 sigint 信号,并在其中关闭任何打开的连接。以下是我们生产服务器的代码。

process.on('SIGINT', () => {                                                                           
    serverVariables.ServerStatics.upStatus = 0;
    console.log('Received Signal To Shutdown Server...Wait For Sometime.... [%s]', timeStamp());
    setTimeout(()=>{
            httpServer.close((e) => {                                                              
            if (e) {
                    console.log(e);
                    process.exit(0);
            }
            require('../signalHandler').cleanShutdown()
                    .then(() => {
                            console.log('SERVER SHUTDOWN SUCCESSFULL....:-) [%s]', timeStamp());
                            process.exit(0);
                    })
                    .catch((e) => {                                                                
                            console.log (e);
                            process.exit(0);                                                       
            });
    });     
    },6000);

});

于 2022-01-31T09:06:20.743 回答