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();
上面的代码对我有用
简单的解决方案是使用 initialize
和 close
等方法创建数据库模块。然后你需要在正确的时间调用这些方法。我喜欢将它们与主模块中的各种事件联系起来。
请查看我关于 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);
});
我正在为我的 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();
上面的代码对我有用
简单的解决方案是使用 initialize
和 close
等方法创建数据库模块。然后你需要在正确的时间调用这些方法。我喜欢将它们与主模块中的各种事件联系起来。
请查看我关于 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);
});