如果我在函数中创建数据库连接,则在函数执行完毕后会破坏连接对象。这是否可靠地关闭数据库连接,还是首先手动关闭它?
为什么我需要知道这一点:
我正在开发一个包,它可以动态创建数据库连接,RODBC或RJDBC作为后端。我设计了我的函数接口,以便您可以传入用户名和密码,或者传递连接对象。通常,当我传入连接对象时,我不希望在函数终止时关闭连接,而当我传入用户名和密码时,我希望它被关闭。
如果我不必担心开放式连接,它会为我简化很多事情,也让我免受很多麻烦。
答案&更
我将Benjamin的答案标记为答案,因为它提供了很好的建议,但实际上我正在寻找的是更多Marek的评论(释义:) 连接可以在连接对象被破坏后打开并且没有办法再次从R访问它们。
我最终找到了一个解决方案,涉及创建一个R6类并定义关闭连接的finalize()
方法(它比on.exit()
更强大),但这超出了本课题的范围。
答案 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)