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

时间:2017-08-30 05:38:59

标签: r database rodbc rjdbc

如果我在函数中创建数据库连接,则在函数执行完毕后会破坏连接对象。这是否可靠地关闭数据库连接,还是首先手动关闭它?

为什么我需要知道这一点:

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

如果我不必担心开放式连接,它会为我简化很多事情,也让我免受很多麻烦。

答案&更

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

我最终找到了一个解决方案,涉及创建一个R6类并定义关闭连接的finalize()方法(它比on.exit()更强大),但这超出了本课题的范围。

1 个答案:

答案 0 :(得分:1)

我编写了许多在调用时创建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)