R如何处理数据库连接的关闭

How does R handle closing of data base connections

如果我在一个函数中创建一个数据库连接,连接对象会在函数完成执行时被销毁。这是否可靠地关闭数据库连接,或者最好先手动关闭它?

为什么我需要知道这个:

我正在开发一个包,它以 RODBC 或 RJDBC 作为后端来动态创建数据库连接。我设计了我的函数接口,这样你就可以传入用户名和密码,或者一个连接对象。通常,当我传入一个连接对象时,我不希望连接在函数终止时关闭,而当我传入用户名和密码时,我希望它被关闭。

如果我不必担心打开的连接,这对我来说会简化很多事情,也会让我省去很多麻烦。

答案及更多:

我将 Benjamin 的回答标记为答案,因为它提供了很好的建议,但实际上我正在寻找的更多是 Marek 的评论(释义:)连接可以在连接对象被销毁后打开并且无法再从 R 访问它们。

我最终寻求的解决方案涉及创建 R6 class 和定义关闭连接的 finalize() 方法(它比 on.exit() 更强大),但这是超出了这个问题的范围。

我编写了很多在调用时创建 ODBC 连接的函数。我的标准做法是:

conn <- RODBC::odbcDriverConnect(...)
on.exit(RODBC::odbcClose(conn))

通过将对象的创建和关闭的代码放在一起,我知道连接将在函数完成时关闭。使用 on.exit 具有关闭连接的额外优势,即使函数因错误而停止也是如此。

编辑:

在您的编辑所描述的问题中,我认为相同的模式是相关的。您需要以仅在您不提供连接对象时才会调用的方式声明 on.exit

db_function <- function(conn = NULL, uid, pwd){
  if (is.null(conn)){
    conn <- RODBC::odbcDriverConnect(...) # Build conn with uid and pwd
    on.exit(RODBC::odbcClose(conn))
  }
}

显示绕过的简单示例on.exit

test_fun <- function(on_exit = FALSE){
  if (on_exit) on.exit(print("hello world"))

  "Look at me"
}

test_fun()

test_fun(TRUE)