R如何处理关闭数据库连接
Posted
技术标签:
【中文标题】R如何处理关闭数据库连接【英文标题】:How does R handle closing of data base connections 【发布时间】:2017-08-30 05:38:58 【问题描述】:如果我在函数中创建数据库连接,则连接对象会在函数完成执行时被销毁。这是否可靠地关闭了数据库连接,还是最好先手动关闭它?
为什么我需要知道这一点:
我正在开发一个使用 RODBC 或 RJDBC 作为后端动态创建数据库连接的包。我设计了我的函数接口,以便您可以传入用户名和密码或连接对象。通常,当我传入一个连接对象时,我不希望在函数终止时关闭连接,而当我传入用户名和密码时,我希望它被关闭。
如果我不必担心打开的连接,它会为我简化很多事情,也可以让我省去很多麻烦。
回答及更多:
我将本杰明的答案标记为答案,因为它提供了很好的建议,尽管实际上我正在寻找的是更多 Marek 的评论(意译:)连接可以在连接对象被破坏后打开并且没有办法不再从 R 访问它们。
我最终找到了一个解决方案,该解决方案涉及创建一个 R6 类并定义关闭连接的 finalize()
方法(它比 on.exit()
更强大),但这超出了本问题的范围。
【问题讨论】:
我只是在与RJDBC
斗争,即使对象被移除,它也不会关闭连接。您可以通过dbDisconnect(name)
关闭连接,但是当您丢失句柄时无法(AFAIK)关闭它(dbListConnection
不起作用)。
旁注:我从RODBC
切换到odbc
(cran.r-project.org/package=odbc)我建议看看它。
可惜了。可悲的是,我不得不使用 RJDBC :(。这实际上已经或多或少地回答了我的问题。
【参考方案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)
【讨论】:
这确实是我通常做的,但是,我目前的用例有点复杂。我并不总是希望在函数终止时关闭连接。我对最初的问题进行了一些澄清。以上是关于R如何处理关闭数据库连接的主要内容,如果未能解决你的问题,请参考以下文章