5

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

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

tbl <- tbl(db, "mytable")
tbl %>% verb1 %>% verb2 %>% ...

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

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

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

我想到的 DBMS 是 SQL Server,驱动程序包是 odbc,以防万一。

4

1 回答 1

2

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

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

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

于 2017-09-15T07:14:29.517 回答