2017-09-14 18 views
5

大多數代碼示例涉及創建一個數據庫連接對象:使用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,萬一它很重要。

+0

想到的唯一情況是,將此連接打開變得非常容易。這對你來說可能是或可能不是一個嚴重的問題。 – Benjamin

回答

2

新的DBI specs假定主叫方通過相應的dbDisconnect()呼叫將其分配的所有連接釋放爲dbConnect()。如果不這樣做,則只會在垃圾收集期間(或R會話結束時)關閉連接,從而延遲解放資源,甚至泄漏連接。

確切的行爲取決於涉及的DBI後端(在本例中爲odbc軟件包)。據吉姆赫斯特,ODBC的維護者,

[它]自動調用dbDisconnect()當連接對象進行垃圾回收,所以這不會泄漏的連接。如果你打開了大量的連接,那麼總是最好是明確的,如果你只是交互式地做這件事情,在這種情況下依靠垃圾收集器可能是確定的。