Node.js 初始化到oracle db的连接,以便在NodeJs中编写的lambda之间重用

Node.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

我在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;
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();
});
我对这一实施并不完全满意。还有其他解决办法吗