Node.js 初始化到oracle db的连接,以便在NodeJs中编写的lambda之间重用
我在Node 6.10中编写了一个lambda函数,它连接到oracle db。我正在使用oracledb模块。由于到oracledb的连接需要10秒以上的时间,因此我希望跨lambda的多次执行重用connection对象 worker.jsNode.js 初始化到oracle db的连接,以便在NodeJs中编写的lambda之间重用,node.js,aws-lambda,node-oracledb,Node.js,Aws Lambda,Node Oracledb,我在Node 6.10中编写了一个lambda函数,它连接到oracle db。我正在使用oracledb模块。由于到oracledb的连接需要10秒以上的时间,因此我希望跨lambda的多次执行重用connection对象 worker.js const os = require('os'); var fs = require('fs'); const str_host = os.hostname() + ' localhost\n'; var oracledb; var connection
const os = require('os');
var fs = require('fs');
const str_host = os.hostname() + ' localhost\n';
var oracledb;
var connection;
var properties;
fs.appendFile(process.env.HOSTALIASES,str_host , function(err){
if(err) throw err;
});
try {
if (typeof oracledb === 'undefined' || oracledb === null ) {
oracledb = require('oracledb');
console.log( 'Oracle DB is supported');
if(typeof connection === 'undefined' || connection === null) {
console.log("Getting a new connection");
getDBConnection(properties, oracledb, function(err,conn) {
if(err) {
callback(err);
} else {
console.log("Setting connection object");
connection = conn;
callback();
}
});
}
}
} catch(dbError) {
console.log('Failed to load oracledb:');
console.log(dbError);
}
function getDBConnection(properties, oracledb, callback) {
var dbProperties = {
user : properties[DB_USER],
password : properties[DB_PASSWORD],
connectString : properties[DB_CONNECTION_STRING]
};
try {
if (typeof oracledb !== 'undefined' && oracledb !== null ) {
oracledb.getConnection(dbProperties)
.then( conn => {
console.log("After getting connection" + conn);
return callback(null, conn);
})
.catch(err => {
console.log("Error getting connection" + err);
return callback(err, null);
});
} else {
console.log("oracledb is undefined");
}
} catch (e) {
console.log('Failed to connect oracledb');
console.log(e);
return callback(e, null);
}
}
exports.handler = function(event, context, callback) {
console.log('Inside worker');
console.log(context);
context.callbackWaitsForEmptyEventLoop = false;
work();
});
处理程序的执行不会等到收到来自oracleDB的连接。另外请注意,在getDbConnection方法中
getConnection(选项)返回一个承诺,我有一个then和catch来确保连接被解决。但我仍然在连接对象初始化之前执行work方法 为了解决这个问题,我做了以下工作,它可以工作,lambda在后续调用中重用oracleDB连接,只要它可以保留上下文 当try-catch块在exports.handler中初始化连接时,更改被移动。handler是lamdba的起点。并将连接变量定义为全局变量
var connection;
var oracledb;
exports.handler = function(event, context, callback) {
console.log('Inside worker');
console.log(context);
context.callbackWaitsForEmptyEventLoop = false;
try {
if (typeof oracledb === 'undefined' || oracledb === null ) {
oracledb = require('oracledb');
console.log( 'Oracle DB is supported');
if(typeof connection === 'undefined' || connection === null) {
console.log("Getting a new connection");
getDBConnection(properties, oracledb, function(err,conn) {
if(err) {
callback(err);
} else {
console.log("Setting connection object");
connection = conn;
callback();
}
});
}
}
} catch(dbError) {
console.log('Failed to load oracledb:');
console.log(dbError);
}
work();
});
我对这一实施并不完全满意。还有其他解决办法吗