gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 23:33:25 24 4
gpt4 key购买 nike

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

为什么我需要知道这个:

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

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

答案及更多:

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

我最终找到了一个解决方案,它涉及创建一个 R6 类并定义关闭连接的 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)

关于r - R如何处理数据库连接的关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45952669/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com