2017-01-25 116 views
1

我已經通過使用這一說法RMySQL包連接到MySQL數據庫:如何檢查通過RMySql連接到MySql是否存在?

con<-dbConnect(drv=RMySQL::MySQL(max.con=1,fetch.default.rec=500),host="host",dbname="dbname",password="psswd",user="user")) 

到目前爲止,沒有任何問題。當我檢查:

>class(con) 
[1] "MySQLConnection" 
attr(,"package") 
[1] "RMySQL" 

一個小時後,我用下面的語句:

dbGetQuery(conn=con,"show tables") 

,我得到了一個錯誤:

Error in .local(dbObj, ...) : 
internal error in RS_DBI_getConnection: corrupt connection handle 

但是,如果我這個語句查詢:

dbListConnections(drv=RMySQL::MySQL()) 

它給出了:

[[1]] 
<MySQLConnection:0,21> 

當我嘗試:

dbDisconnect(conn=con) 

我得到了同樣的錯誤:

Error in .local(dbObj, ...) : 
internal error in RS_DBI_getConnection: corrupt connection handle 

然後我刪除了連接對象:

rm(con) 

當我試圖連接再次使用dbConnect(),我得到這個錯誤:

con<-dbConnect(drv=RMySQL::MySQL(max.con=1,fetch.default.rec=500),host="host",dbname="dbname",password="psswd",user="user")) 
Error in .local(drv, ...): Cannot allocate a new connection: 1 connections already opened 

我知道dbListConnections()調用在沒有連接到數據庫時返回一個空列表。但在這種情況下不會返回空列表。

是在損壞的連接處理不同狀態比斷開狀態連接的

連接超時?

如果與數據庫的連接仍在工作,最好的方法是保持檢查狀態?

+2

保持連接打開這麼久是非常非常嚴重的錯誤。您應該在完成使用後立即關閉連接。原因是任何事務,連接打開時獲取的鎖都會一直持續到關閉爲止,導致嚴重的性能下降。只需關閉連接並在必要時打開它*僅在需要時 –

+1

換句話說,如果您在其他人使用的數據庫上這樣做,您會收到來自DBA的緊急電話 –

+0

@PanagiotisKanavos好吧。謝謝你指出這個錯誤。所以我應該認爲這是我的一個執行錯誤,而不是包裹問題? – TUSHAr

回答

1

您仍可能需要關閉與dbDisconnect(con)而不是rm(con)的連接才能釋放內部連接句柄並允許建立新連接。後者只會刪除一個指向連接對象的「指針」(以便您不能通過con訪問此對象),但它在物理上仍然存在,直到garbage collection

您可以通過dbIsValid(con)或使用簡單的dbGetQuery(con, "SELECT 1")來檢查連接是否有效。我很想知道,如果前者檢測到系統上的斷開連接,那麼圍繞此主題有一個discussion on GitHub

+0

我試過在問題中提到dbDisconnect(con)。但它會拋出損壞的連接句柄錯誤。我將在明天檢查dbIsValid(con)命令。 – TUSHAr

+0

我建立了連接,查詢了數據庫,然後使用dbDisconnect(con)斷開了連接。之後,如果我執行,dbIsValid(con):我得到了錯誤的連接句柄錯誤。但使用相同的(con)我可以重新連接到數據庫。我沒有檢查過這個連接是否可以保持更長的時間,因爲我根據@Panagiotis Kanavos的建議更改了我的代碼。 – TUSHAr

+1

你看過「pool」嗎?這裏是[Github回購](https://github.com/rstudio/pool),這裏有一個[介紹文章](http://shiny.rstudio.com/articles/pool-basics.html)。它爲您完成了所有這些樣板工作......它基本上可以讓您不用擔心@Panagiotis Kanavos在寫道:「保持連接打開這麼久是一個非常非常嚴重的錯誤。」它會確保你沒有這樣做,同時給你完全相同的語義。 –