显示如何将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,以防万一。
答案 0 :(得分:2)
新的DBI specs假设调用者释放了他们使用dbConnect()
分配的所有连接以及对dbDisconnect()
的相应调用。如果不这样做,将仅在垃圾收集期间(或R会话结束时)关闭连接,从而延迟资源的释放,甚至泄露连接。
确切的行为取决于所涉及的DBI后端(在本例中为odbc包)。根据odbc的维护者Jim Hester的说法,
当连接对象被垃圾收集时,[it]会自动调用
dbDisconnect()
,因此不会泄漏连接。如果你打开大量的连接,最好是明确的,如果你只是以交互方式进行,那么在这种情况下依赖垃圾收集器可能是好的。