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如何处理关闭数据库连接的主要内容,如果未能解决你的问题,请参考以下文章

如何处理网络中断和连接池

如何处理 Play 1.X 中的数据库连接错误?

Unexpected EOF 远程主机强迫关闭了一个现有的连接 如何处理

GreenPlum 如何处理多个大型连接和同时工作负载?

我们如何处理 MongoDB 连接、模式?

连接停止时如何处理猫鼬数据库