我有一个用java编写的简单的aws lambda(不涉及框架)。 目前,我对 DBConnection 使用了 Singleton 实例,因为只要 lambda 是热的,我就想重复使用早期的 DBconnection 对象。还有,最好的practice建议在处理程序之外编写代码,以实现高效重用并减少运行时间。 我想再次使用相同的数据库连接。但我观察到每次调用 lambda 时都会关闭连接,因此它违背了 Singleton 的目的。为了解决这个问题,我不会关闭创建的连接。 (默认情况下,由于可自动关闭行为,它正在关闭,我现在摆脱了它。) 用于连接的 Singleton 类如下:
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;
}
}
我的问题是:
- 如果我不关闭客户端中的连接,会对服务器端产生任何影响吗?
- 我应该不必担心,因为 lambda 调用本身在单独的 JVM 中运行,并且如果 JVM 关闭,无论如何连接对象都会被 GC 处理?
这个想法是在没有任何框架的情况下重用 AWS lambda 中的数据库连接对象。
最佳答案
- Is there any repercussions on the server-side if I don't close the connection in the client?
应该不会有任何影响。 AWS Lambda 函数创建容器和资源来执行您的代码。当您的 Lambda 函数执行完毕后,仍在运行的后台进程将在下次调用 Lambda 时重用。但是,不保证 AWS 会重复使用相同的容器。所以初始化实际上可能发生。
您可以阅读 Lambda 函数中的卡住/解冻循环 here .
- 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 没有关闭连接,操作系统将处理它。这并不能确保它得到适当的处理,但此时,由操作系统决定如何管理进程和资源。
关于java - 我应该关闭 AWS lambda 内的 Singleton DB 连接对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72230147/