我应该关闭 AWS lambda 中的 Singleton DB 连接对象吗?

should I close the Singleton DB connection object inside AWS lambda?

我有一个用 java 编写的简单的 aws lambda(不涉及框架)。 目前,我已经为 DBConnection 使用了一个 Singleton 实例,因为只要 lambda 是热的,我就想重新使用早期的 DBconnection 对象。此外,最好的 practice 建议在处理程序外部编写代码以实现高效重用和减少运行时间。 我想再次使用相同的数据库连接。但我观察到连接在每次调用 lambda 时都会关闭,因此它违背了 Singleton 的目的。为了解决这个问题,我不会关闭创建的连接。 (默认情况下,由于我现在摆脱了可自动关闭的行为,它正在关闭。) 用于连接的单例 class 如下:

 public enum DatabaseConnection {
  
    INSTANCE;
   static Connection CONNECTION = null;
   static String url = "jdbc:URL";
   static String user = "user";
   static String pass = "pwd";
   static 
   {
        try {
            CONNECTION = DriverManager.getConnection(url, user, pass);
        }
        catch (SQLException e) {
        }
    }
    public Connection getConnection(LambdaLogger logger) throws SQLException
    {
        
        if(CONNECTION == null || CONNECTION.isClosed()) {
            CONNECTION = DriverManager.getConnection(url, user, pass);
        }
        
        return CONNECTION;
    }
}

我的问题是:

  1. 如果我不在客户端关闭连接,对服务器端有什么影响吗?
  2. 我是否不必担心,因为 lambda 调用本身在单独的 JVM 中运行,如果 JVM 关闭,无论如何连接对象都会被 GC 处理?

想法是在没有任何框架的情况下在 AWS lambda 中重用数据库连接对象。

  1. Is there any repercussions on the server-side if I don't close the connection in the client?

应该不会有任何影响。 AWS Lambda 函数创建容器和资源来执行您的代码。当您的 Lambda 函数完成执行时,仍然 运行 的 后台进程将在下次调用 lambda 时重新使用。但是,不保证AWS会重用同一个容器。所以初始化实际上可能会发生。

您可以阅读 Lambda 函数中的 Freeze/Thaw 循环 here

  1. Should I need not worry as lambda invocation runs in a separate JVM itself and if the JVM shuts down, anyway the connection object is GCed?

如果 JVM 关闭,垃圾收集将关闭所有打开的流。如果由于某种原因 JVM 没有关闭连接,OS 将处理它。这并不能确保它会得到适当的处理,但在这一点上,这取决于 OS 如何管理进程和资源。