如何正确关闭lambda函数中的数据库连接?

时间:2017-08-22 00:58:57

标签: lambda aws-lambda serverless-framework

在我的lambda函数中,我试图在发送回调时立即关闭mongo连接。但它有一个问题。

  • 当我发送请求时,该函数执行其职责,发送回调并关闭数据库连接。
  • 发送第二个请求时,该功能超时。
  • 当我删除db.close()内容完美无缺时。

我认为lambda重用了所有函数的连接,因为我在处理程序的顶部打开了连接:

// Connect to database
mongoose.connect(process.env.DATABASE_URL);


const handleCreateUser = async (event, context, callback) => {
  // eslint-disable-next-line no-param-reassign
  context.callbackWaitsForEmptyEventLoop = false;

  const data = JSON.parse(event.body);
  const { user, userProfile } = data;

  await createUser({ callback, user, userProfile });
};

知道怎么解决这个问题吗?我们真的必须在此时关闭连接吗?

3 个答案:

答案 0 :(得分:4)

在处理程序中移动mongoose.connect代码,或者停止调用db.close()。您当前有一个数据库连接被Lambda函数的多次调用重用,但是在第一次调用完成后您将关闭它。

答案 1 :(得分:0)

我的用法是 Python,但您将使用首选语言执行此操作。 lambda 的最佳解决方案,考虑按次付费: 在lamba函数之前全局运行它(我在配置类中执行)

if self.conn == None or self.conn.close == 1:
  self.make_connection()

取决于您如何实现 make_connection()。 根本不要使用 db.close()。

AWS 调用会加载您的 lambda 函数并运行一次全局函数。 之后每次调用它只运行它保持加载一段时间的 lambda(从一些测试 20 分钟到 50 分钟)。 数据库驱动程序将在内部超时时关闭连接。

优点 - 您在很长一段时间内只打开一次连接,为每次 lambda 运行节省时间。

缺点 - lambda 一直在内存中。

在我看来这是值得的。

答案 2 :(得分:-3)

可以尝试 try-with-resource 自动关闭连接。