【发布时间】:2022-04-09 11:20:05
【问题描述】:
有没有办法连接到 Lambda 的关机?我正在打开一个数据库连接并希望它保持打开状态,但我想确保它在 Lambda 终止时关闭。
【问题讨论】:
-
为什么您的 Lambda 在能够彻底关闭连接之前就被终止了?
-
@stdunbar 我想在 Lambda 中做一些基本的连接池,所以我不需要在每个请求上打开一个连接。
标签: aws-lambda
有没有办法连接到 Lambda 的关机?我正在打开一个数据库连接并希望它保持打开状态,但我想确保它在 Lambda 终止时关闭。
【问题讨论】:
标签: aws-lambda
您可能对 Lambda 实例被终止而不是单个调用结束时引发的事件感兴趣,对吧?不过,您对两者都有一个选择,但我怀疑它们会帮助您..
您可以使用上下文方法 getRemainingTimeInMillis()(链接到 Node.js,但在其他编程语言中类似)来查明您的 Lambda 函数的当前调用何时超时。这可能有助于清理事情或充分利用您的 Lambda 函数的时间。我不建议在每次调用结束时清理您的数据库连接,因为这样您就不会在以后的调用中重用它们,这会减慢您的 Lambda 函数。但如果你对此没问题,那就去吧。请记住,这仅在您的函数正在运行时才有效。一旦您返回响应,您就无法执行任何清理操作,因为您的 Lambda 函数将进入“睡眠模式”。您需要在退货之前执行此操作。
或者,您可以使用Extensions API。它提供了一个关闭阶段,并通过Shutdown 事件触发扩展。但是,由于扩展位于 除了 您的函数(而不是在您的函数代码中),我不确定您是否有机会使用这种方法清理任何数据库连接...另见@ 987654323@ 了解更多信息。
【讨论】:
不,您不能挂钩 Lambda 执行上下文的关闭。
Lambda 自行处理并决定是否以及何时重用或销毁执行上下文。
您可能不得不依靠连接自行超时。
【讨论】:
假设您有一个用于暖 lambda 的池连接,您可以注册一个关闭挂钩来关闭数据库连接或释放任何其他资源,您只有 500 毫秒来执行此任务。
class EnvironmentConfig {
private static volatile boolean shutdownRegistered;
private static volatile HikariDataSource ds;
private void registerShudownHook() {
if (!shutdownRegistered) {
synchronized (lock) {
if (!shutdownRegistered) {
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
if (ds != null) {
ds.close();
}
}));
EnvironmentConfig.shutdownRegistered = true;
}
}
}
}
public DataSource dataSource() throws PropertyVetoException {
HikariDataSource _ds = EnvironmentConfig.ds;
if (_ds == null) {
synchronized (lock) {
_ds = EnvironmentConfig.ds;
if (_ds == null) {
_ds = new HikariDataSource();
// TODO: set connection props
EnvironmentConfig.ds = _ds;
registerShudownHook();
}
}
}
return _ds;
}
}
您可以在任何地方引用数据源以获取将创建实例并注册关闭挂钩的单例副本。
您的关闭钩子可以执行其他任务,前提是它可以快速完成它们,或者您可以注册多个钩子,只是不要对您正在注册的线程数量发疯。
【讨论】: