使用dplyr与数据库,而无需创建一个明确的DBI对象展示如何使用数据库使用dplyr
问题描述:
大多数代码示例涉及创建一个数据库连接对象:使用dplyr与数据库,而无需创建一个明确的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,万一它很重要。
答
新的DBI specs假定主叫方通过相应的dbDisconnect()
呼叫将其分配的所有连接释放为dbConnect()
。如果不这样做,则只会在垃圾收集期间(或R会话结束时)关闭连接,从而延迟解放资源,甚至泄漏连接。
确切的行为取决于涉及的DBI后端(在本例中为odbc软件包)。据吉姆赫斯特,ODBC的维护者,
[它]自动调用
dbDisconnect()
当连接对象进行垃圾回收,所以这不会泄漏的连接。如果你打开了大量的连接,那么总是最好是明确的,如果你只是交互式地做这件事情,在这种情况下依靠垃圾收集器可能是确定的。
想到的唯一情况是,将此连接打开变得非常容易。这对你来说可能是或可能不是一个严重的问题。 – Benjamin