Node.js 退出时如何释放 Oracle 数据库连接

How to release Oracle Database connection when Node.js exits

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

更改任何 table 时,出现错误 资源已被使用

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

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

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

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

所以我需要简单的帮助

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

任何帮助将不胜感激

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);

关于 nodejs exit 的类似问题在 link

       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();

上面的代码对我有用

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

请查看我关于 Creating a REST API with Node.js and Oracle Database 的系列文章的第 1 部分和第 2 部分以获取灵感。

您可以捕获用于 ctrl+c 事件的 sigint 信号,您可以在其中关闭任何打开的内容 connections.Below 是来自我们生产服务器的代码。

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);

});