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

时间:2017-09-14 17:10:46

标签: sql-server r dplyr odbc 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 %>% ...

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

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

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

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

1 个答案:

答案 0 :(得分:2)

新的DBI specs假设调用者释放了他们使用dbConnect()分配的所有连接以及对dbDisconnect()的相应调用。如果不这样做,将仅在垃圾收集期间(或R会话结束时)关闭连接,从而延迟资源的释放,甚至泄露连接。

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

  当连接对象被垃圾收集时,

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