将dplyr与数据库一起使用而不创建显式DBI对象

Hon*_*Ooi 5 sql-server odbc r dplyr r-dbi

大多数代码示例显示如何将dplyr与数据库一起使用涉及创建数据库连接对象:

connStr <- "driver=driver;server=hostname;database=mydatabase;..."
db <- DBI::dbConnect(odbc::odbc(), .connection_string=connStr)

tbl <- tbl(db, "mytable")
tbl %>% verb1 %>% verb2 %>% ...
Run Code Online (Sandbox Code Playgroud)

但是,假设我省略了创建db对象:

tbl <- tbl(DBI::dbConnect(odbc::odbc(), .connection_string=connStr), "mytable")
tbl %>% verb1 %>% verb2 %>% ...
Run Code Online (Sandbox Code Playgroud)

这有什么后果吗?我会耗尽数据库资源/泄漏内存/等吗?

我想到的DBMS是SQL Server,驱动程序包是odbc,以防它重要.

krl*_*mlr 2

新的DBI 规范假设调用者dbConnect()通过相应的调用释放他们分配的所有连接dbDisconnect()。如果不这样做,只会在垃圾收集期间(或 R 会话结束)关闭连接,从而延迟资源的释放,甚至泄漏连接。

确切的行为取决于所涉及的 DBI 后端(在本例中为 odbc 包)。根据 odbc 的维护者 Jim Hester 的说法,

[it]dbDisconnect()当连接对象被垃圾收集时自动调用,因此不会泄漏连接。如果您要打开大量连接,那么最好是明确的,如果您只是以交互方式执行此操作,则在这种情况下依赖垃圾收集器可能是可以的。